{
  "summary": {
    "checked_at": "2026-11-03T08:36:08.762243+00:00",
    "database": {
      "database": "kaisha_db",
      "user": "quyi_tokyo",
      "read_only": "on"
    },
    "registry_sources": 223,
    "mapped_sources_any_evidence": 214,
    "mapped_sources_confirmed_code": 214,
    "crawlers_any_evidence": 209,
    "business_tables_any_evidence": 81,
    "relationships_by_status": {
      "confirmed_code": 371,
      "declared_lineage": 2
    },
    "unresolved_sources": 9,
    "online_readable_files": 378,
    "online_unreadable_files": 0,
    "schedule_tasks": 169,
    "parse_errors": []
  },
  "dimensions": [
    "公司基本信息",
    "经营与业务",
    "地址和联络信息",
    "分店、分部和设施",
    "代表者与管理层",
    "员工与组织构成",
    "沿革与发展历程",
    "新闻与公告",
    "招聘和人才信息",
    "资质与合规信息",
    "规模与经营数据"
  ],
  "sources": [
    {
      "id": 1,
      "code": "nta_houjin",
      "name_ja": "国税庁 法人番号公表サイト",
      "name_en": "NTA Corporate Number",
      "category": "registry",
      "is_active": true,
      "base_url": "https://www.houjin-bangou.nta.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅法人编号公示平台，提供法人编号、名称及总部所在地的检索、文件下载和 API，是法人身份与地址变更核对的基础来源。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:20:59.879519+00:00",
        "url": "https://www.houjin-bangou.nta.go.jp/",
        "final_url": "https://www.houjin-bangou.nta.go.jp/",
        "page_title": "国税庁法人番号公表サイト",
        "page_excerpt": "このサイトでは、法人番号の指定を受けた者の1.商号又は名称、2.本店又は主たる事務所の所在地、3.法人番号（基本３情報）を公表しています。また、「基本３情報ダウンロード」画面より、データをダウンロードすることができます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 2,
      "code": "gbizinfo",
      "name_ja": "gBizINFO",
      "name_en": "gBizINFO",
      "category": "registry",
      "is_active": true,
      "base_url": "https://info.gbiz.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省的政府法人信息汇总平台，按法人编号汇集企业基本资料，以及许可、补助、采购、表彰、专利和财务等政府持有信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:20:59.880033+00:00",
        "url": "https://info.gbiz.go.jp/",
        "final_url": "https://info.gbiz.go.jp/",
        "page_title": "Gビズインフォ （METI）経済産業省",
        "page_excerpt": "Gビズインフォは経済産業省による、500万社以上の政府保有法人データ提供サイトです。 Gビズインフォは経済産業省による、500万社以上の政府保有法人データ提供サイトです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 3,
      "code": "edinet",
      "name_ja": "EDINET",
      "name_en": "EDINET",
      "category": "finance",
      "is_active": true,
      "base_url": "https://disclosure2.edinet-fsa.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅电子披露平台，提供有价证券报告书、临时报告书、大量持股报告等法定披露文件及 XBRL，用于了解财务、股权、役员和业务情况。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:20:59.880116+00:00",
        "url": "https://disclosure2.edinet-fsa.go.jp/",
        "final_url": "https://disclosure2.edinet-fsa.go.jp/",
        "page_title": "閲覧サイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 4,
      "code": "tdnet",
      "name_ja": "TDnet 適時開示",
      "name_en": "TDnet",
      "category": "finance",
      "is_active": true,
      "base_url": "https://www.release.tdnet.info/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "上市公司适时披露平台，发布决算、经营事项和公司行动等公告及附件，适合追踪企业最新披露。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:20:59.880173+00:00",
        "url": "https://www.release.tdnet.info/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error _ssl.c:993: The handshake operation timed out>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 5,
      "code": "jpx_listed",
      "name_ja": "JPX 上場会社情報",
      "name_en": "JPX Listed Companies",
      "category": "finance",
      "is_active": true,
      "base_url": "https://www.jpx.co.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本交易所集团的上市公司资料，提供证券代码、公司名称、市场与行业分类，用于上市身份核对和证券代码匹配。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:20:59.880231+00:00",
        "url": "https://www.jpx.co.jp/",
        "final_url": "https://www.jpx.co.jp/",
        "page_title": "日本取引所グループ",
        "page_excerpt": "日本取引所グループ（JPX）の公式サイト。東京証券取引所、大阪取引所、東京商品取引所等を運営し、持続可能な社会と経済発展の実現に貢献します。 日本取引所グループ（JPX）の公式サイト。東京証券取引所、大阪取引所、東京商品取引所等を運営し、持続可能な社会と経済発展の実現に貢献します。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 6,
      "code": "kanpou",
      "name_ja": "官報",
      "name_en": "Kanpo",
      "category": "registry",
      "is_active": true,
      "base_url": "https://kanpou.npb.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本官报的来源登记，内容涵盖政府公示和企业法定公告；旧站已跳转至现行官方官报网站。与其他官报登记的 source ID 绑定仍单独保留。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:20:59.880278+00:00",
        "url": "https://kanpou.npb.go.jp/",
        "final_url": "https://www.kanpo.go.jp/",
        "page_title": "官報",
        "page_excerpt": "内閣府の官報発行サイトです。直近90日分の官報（本紙、号外、政府調達公告等）を閲覧・ダウンロードできます。90日経過後の記事も、一部の記事を除き閲覧可能です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 7,
      "code": "estat",
      "name_ja": "e-Stat 政府統計",
      "name_en": "e-Stat",
      "category": "registry",
      "is_active": true,
      "base_url": "https://www.e-stat.go.jp/api/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本政府统计门户，提供统计表、调查结果和统计数据下载，适合补充地区、人口、产业等宏观背景。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:20:59.880317+00:00",
        "url": "https://www.e-stat.go.jp/api/",
        "final_url": "https://www.e-stat.go.jp/api/",
        "page_title": "Request Rejected",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 8,
      "code": "data_go_jp",
      "name_ja": "DATA.GO.JP",
      "name_en": "Open Data Catalog",
      "category": "registry",
      "is_active": true,
      "base_url": "https://data.e-gov.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "政府开放数据目录门户，汇集各部门数据集说明和资源链接；目录本身与资源文件的实际数据内容分开。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:20:59.880357+00:00",
        "url": "https://data.e-gov.go.jp/",
        "final_url": "https://data.e-gov.go.jp/info/ja",
        "page_title": "トップ | e-Govデータポータル",
        "page_excerpt": "公共データに由来するオープンデータのデータカタログを一元的に提供しています。オープンデータ化された公共データに関するメタ情報を横断検索でき、機会判読性の高いデータの場合は、オープンデータの内容を可視化できます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 9,
      "code": "resas",
      "name_ja": "RESAS API",
      "name_en": "RESAS",
      "category": "registry",
      "is_active": true,
      "base_url": "https://opendata.resas-portal.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "地区经济分析系统的 API 来源登记，面向人口、产业和地区经济分析；此前核查显示原 API 已结束服务，不能视为当前可用接口。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:01.790637+00:00",
        "url": "https://opendata.resas-portal.go.jp/",
        "final_url": "https://opendata.resas-portal.go.jp/",
        "page_title": "RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報",
        "page_excerpt": "地域経済分析システム（RESAS：リーサス）のデータがAPI提供されます。API提供されることにより、従来よりも深く・自由に分析することが可能となります。今までRESASでは見えなかった各地域における真の課題の抽出や地域資源の再発見をサポートし、地域ビジネスに通じるサービスを地域自らが創り上げることが可能となります。 地域経済分析システム（RESAS：リーサ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10,
      "code": "egov_law",
      "name_ja": "e-Gov 法令検索 API",
      "name_en": "e-Gov Law Search",
      "category": "registry",
      "is_active": true,
      "base_url": "https://laws.e-gov.go.jp/apitop/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "e-Gov 法令检索服务，提供日本法令名称、编号、条文与修订相关信息，作为法规文本和合规背景来源。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:01.817093+00:00",
        "url": "https://laws.e-gov.go.jp/apitop/",
        "final_url": "https://laws.e-gov.go.jp/apitop/",
        "page_title": "e-Gov 法令検索",
        "page_excerpt": "電子政府の総合窓口（e-Gov）。法令（憲法・法律・政令・勅令・府省令・規則）の内容を検索して提供します。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 11,
      "code": "fsa_actions",
      "name_ja": "金融庁 行政処分",
      "name_en": "FSA Administrative Actions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/news/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅公布的金融机构及相关经营者行政处分，包含处分对象、日期、依据和具体内容。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:02.200328+00:00",
        "url": "https://www.fsa.go.jp/news/",
        "final_url": "https://www.fsa.go.jp/news/",
        "page_title": "報道発表資料：金融庁",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 12,
      "code": "caa_actions",
      "name_ja": "消費者庁 処分公表",
      "name_en": "CAA Actions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.caa.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "消费者厅公开的消费交易及广告表示等行政处分公告，用于追踪企业受到的监管措施。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:12.342775+00:00",
        "url": "https://www.caa.go.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error [Errno 8] nodename nor servname provided, or not known>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 13,
      "code": "jftc_actions",
      "name_ja": "公正取引委員会 排除措置・課徴金",
      "name_en": "JFTC Actions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.jftc.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "公平交易委员会公布的排除措施命令、罚款及竞争法案件，提供案件对象、事由和处理结果。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:02.591360+00:00",
        "url": "https://www.jftc.go.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 14,
      "code": "sesc_actions",
      "name_ja": "証券取引等監視委員会 課徴金事例",
      "name_en": "SESC Cases",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/sesc/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "证券交易等监视委员会公布的课征金建议及违法证券交易事例，作为证券市场监管事件来源。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:02.894716+00:00",
        "url": "https://www.fsa.go.jp/sesc/",
        "final_url": "https://www.fsa.go.jp/sesc/",
        "page_title": "証券取引等監視委員会",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15,
      "code": "mhlw_actions",
      "name_ja": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "name_en": "MHLW Actions + Black Companies",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省及地方劳动局公开的劳动相关法律违法案件，提供被公示企业、违法事项和公布时间。 本次登记 URL 返回的是雇佣助成金相关页面，与登记名称不完全相符；具体劳动违法入口以程序 URL 依据为准。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:03.252425+00:00",
        "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
        "final_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
        "page_title": "事業主の方のための雇用関係助成金｜厚生労働省",
        "page_excerpt": "都道府県労働局等が公表した不正受給に関与した社会保険労務士・代理人・訓練実施機関へのリンクを掲載しています。 都道府県労働局等が公表した不正受給に関与した社会保険労務士・代理人・訓練実施機関へのリンクを掲載しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "登记名称指劳动违法公示，但当前 URL 返回雇佣助成金页面，入口范围待核对。",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 16,
      "code": "mlit_negative",
      "name_ja": "国交省 ネガティブ情報等検索",
      "name_en": "MLIT Negative Info",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.mlit.go.jp/nega-inf/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省的负面信息检索平台，汇集其主管行业经营者的行政处分等公开信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:03.370422+00:00",
        "url": "https://www.mlit.go.jp/nega-inf/",
        "final_url": "https://www.mlit.go.jp/nega-inf/",
        "page_title": "国土交通省　ネガティブ情報等検索サイト",
        "page_excerpt": "事業者の過去の行政処分歴を検索するサイトです",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17,
      "code": "ppc_actions",
      "name_ja": "個人情報保護委員会 処分",
      "name_en": "PPC Actions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.ppc.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "个人信息保护委员会公开的指导、建议和命令等监管公告，用于识别个人信息保护相关事件。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:03.408109+00:00",
        "url": "https://www.ppc.go.jp/",
        "final_url": "https://www.ppc.go.jp/",
        "page_title": "個人情報保護委員会 - PPC ｜個人情報保護委員会",
        "page_excerpt": "個人情報保護委員会の組織・活動方針・活動報告・予算・委員会開催に関する情報を掲載しています。個人情報保護委員会が発信している 出版物・動画・マンガ・教育資料 及び 報道発表や説明会、調達・採用 等について掲載しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18,
      "code": "nta_taino",
      "name_ja": "国税庁 公示・刑事告発",
      "name_en": "NTA Disclosure",
      "category": "admin_action",
      "is_active": false,
      "base_url": "https://www.nta.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅公开公告及刑事告发相关信息登记，用于补充涉税公开事件；登记不代表所有税务状态都公开。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:12.343340+00:00",
        "url": "https://www.nta.go.jp/",
        "final_url": "https://www.nta.go.jp/index.htm",
        "page_title": "国税庁",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19,
      "code": "env_sanpai",
      "name_ja": "環境省 産廃情報ネット",
      "name_en": "MOE Industrial Waste Info",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.sanpainet.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "产业废弃物处理行业公开信息平台，包含处理业者及许可相关信息，供企业行业和资质识别使用。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:03.981717+00:00",
        "url": "https://www.sanpainet.or.jp/",
        "final_url": "https://www.sanpainet.or.jp/",
        "page_title": "公益財団法人 産業廃棄物処理事業振興財団｜産業廃棄物処理事業振興財団のホームページです。",
        "page_excerpt": "公益財団法人産業廃棄物処理事業振興財団のホームページです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 20,
      "code": "pmda_recall",
      "name_ja": "PMDA 医薬品/医療機器 回収",
      "name_en": "PMDA Recall",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.info.pmda.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "医药品医疗器械综合机构公开的药品和医疗器械回收信息，包括产品、回收等级、企业和原因。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:04.115137+00:00",
        "url": "https://www.info.pmda.go.jp/",
        "final_url": "https://www.info.pmda.go.jp/",
        "page_title": "医薬品医療機器情報提供ホームページ",
        "page_excerpt": "添付文書、副作用・不具合、回収、審査報告書など、医薬品・医療機器等に関する安全性情報を中心に厚生労働省や企業から提供された情報を掲載。医療関係者（医師・薬剤師等）向けの情報、一般の方向けの情報がある。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 21,
      "code": "nite_jiko",
      "name_ja": "NITE 製品事故情報",
      "name_en": "NITE Product Accidents",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.nite.go.jp/jiko/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "产品评价技术基础机构公布的产品事故信息和周报，包含产品、事故经过及相关经营者。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:04.574281+00:00",
        "url": "https://www.nite.go.jp/jiko/",
        "final_url": "https://www.nite.go.jp/jiko/",
        "page_title": "製品安全 | 製品安全 | 製品評価技術基盤機構",
        "page_excerpt": "製品評価技術基盤機構のホームページです。製品安全分野の情報を掲載しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 22,
      "code": "caa_recall",
      "name_ja": "消費者庁 リコール情報",
      "name_en": "CAA Recall",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.recall.caa.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "消费者厅产品召回信息平台，按产品、企业和时间提供召回公告及措施。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:12.343417+00:00",
        "url": "https://www.recall.caa.go.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error [Errno 8] nodename nor servname provided, or not known>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 23,
      "code": "mofa_sanctions",
      "name_ja": "外務省 経済制裁",
      "name_en": "MOFA Sanctions",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.mofa.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本外务省发布的经济制裁政策和相关名单，是制裁背景及措施的官方信息入口。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:05.461788+00:00",
        "url": "https://www.mofa.go.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 24,
      "code": "ofac_sdn",
      "name_ja": "OFAC SDN List",
      "name_en": "OFAC SDN",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.treasury.gov/ofac/downloads/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "美国财政部 OFAC 的 SDN 制裁名单，包含被列名个人、实体、别名和识别资料。名单命中需进一步核实身份。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:05.791896+00:00",
        "url": "https://www.treasury.gov/ofac/downloads/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 25,
      "code": "un_sanctions",
      "name_ja": "UN Sanctions List",
      "name_en": "UN Sanctions",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.un.org/securitycouncil/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "联合国安理会综合制裁名单，包含制裁对象及身份资料，供制裁核查使用。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:06.057244+00:00",
        "url": "https://www.un.org/securitycouncil/",
        "final_url": "https://main.un.org:443/securitycouncil/en",
        "page_title": "Homepage | Security Council",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 26,
      "code": "eu_sanctions",
      "name_ja": "EU Sanctions",
      "name_en": "EU Sanctions",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.sanctionsmap.eu/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "欧盟金融制裁对象数据，提供列名主体、别名和相关法律依据。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:06.422661+00:00",
        "url": "https://www.sanctionsmap.eu/",
        "final_url": "https://www.sanctionsmap.eu/",
        "page_title": "EU Sanctions Map",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 27,
      "code": "uk_sanctions",
      "name_ja": "HMT UK Sanctions",
      "name_en": "UK Sanctions",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "英国制裁名单来源登记，提供受制裁对象和身份识别信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:06.918232+00:00",
        "url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
        "final_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
        "page_title": "The UK Sanctions List - GOV.UK GOV.UK",
        "page_excerpt": "Find out which people, entities and ships are designated or specified under regulations made under the Sanctions and Anti-Money Laundering Act 2018, and why. Find out which people,",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 28,
      "code": "jgrants",
      "name_ja": "jGrants 補助金",
      "name_en": "jGrants",
      "category": "tender",
      "is_active": true,
      "base_url": "https://www.jgrants-portal.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本补助金申请平台的公开补助项目接口，提供项目名称、实施机构、申请期限、对象与申请条件。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:07.133897+00:00",
        "url": "https://www.jgrants-portal.go.jp/",
        "final_url": "https://www.jgrants-portal.go.jp/",
        "page_title": "Jグランツ ネットで簡単！補助金申請 | Jグランツ",
        "page_excerpt": "Jグランツはデジタル庁が運営する、国や自治体の補助金の電子申請システムです。個人事業主や中小企業等の法人はGビズIDを利用し、補助金・助成金を簡単に検索・申請できます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 29,
      "code": "geps",
      "name_ja": "電子調達 GEPS",
      "name_en": "GEPS",
      "category": "tender",
      "is_active": true,
      "base_url": "https://www.geps.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "政府电子采购平台的公开采购及落札资料，用于了解政府采购项目、供应商和成交信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:07.252650+00:00",
        "url": "https://www.geps.go.jp/",
        "final_url": "https://www.geps.go.jp/",
        "page_title": "リダイレクトページ | 政府電子調達(GEPS)",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 30,
      "code": "reinfolib",
      "name_ja": "不動産情報ライブラリ",
      "name_en": "MLIT Real Estate Info Library",
      "category": "realestate",
      "is_active": true,
      "base_url": "https://www.reinfolib.mlit.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省不动产信息库，提供交易价格及地区、规划、防灾等空间信息，用于构建企业所在地环境画像。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:07.989983+00:00",
        "url": "https://www.reinfolib.mlit.go.jp/",
        "final_url": "https://www.reinfolib.mlit.go.jp/",
        "page_title": "不動産情報ライブラリ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 31,
      "code": "nichibenren",
      "name_ja": "日弁連 弁護士検索",
      "name_en": "Bar Association Lawyer Search",
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.nichibenren.or.jp/search.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本律师联合会相关律师检索入口登记，面向律师和事务所资料；覆盖范围需与具体检索服务区分。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:08.075648+00:00",
        "url": "https://www.nichibenren.or.jp/search.html",
        "final_url": "https://www.nichibenren.or.jp/search.html",
        "page_title": "弁護士検索｜日本弁護士連合会",
        "page_excerpt": "全ての弁護士を検索できる「弁護士検索」と、弁護士情報提供サービス「ひまわりサーチ」のご案内。 全ての弁護士を検索できる「弁護士検索」と、弁護士情報提供サービス「ひまわりサーチ」のご案内。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 32,
      "code": "shihoshoshi",
      "name_ja": "司法書士検索",
      "name_en": "Shihoshoshi Search",
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.shiho-shoshi.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "司法书士联合会的专业人员检索服务，提供司法书士及事务所等公开资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:08.326084+00:00",
        "url": "https://www.shiho-shoshi.or.jp/",
        "final_url": "https://www.shiho-shoshi.or.jp/",
        "page_title": "日本司法書士会連合会 | Home",
        "page_excerpt": "日本司法書士会連合会は、司法書士制度の維持・発展と社会に対する責任を果たすことを目的として様々な活動を行っています。全国での相談窓口、法律相談、トラブル解決、法教育、人権に対する取り組みなど、「あなたの街の身近な法律家」として活動しています。 日本司法書士会連合会は、司法書士制度の維持・発展と社会に対する責任を果たすことを目的として様々な活動を行っています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 33,
      "code": "gyoseishoshi",
      "name_ja": "行政書士検索",
      "name_en": "Gyoseishoshi Search",
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.gyosei.or.jp/members-search",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "行政书士联合会会员检索服务，提供行政书士、行政书士法人及事务所信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:08.533774+00:00",
        "url": "https://www.gyosei.or.jp/members-search",
        "final_url": "https://www.gyosei.or.jp/members-search",
        "page_title": "行政書士会員検索 | 日本行政書士会連合会",
        "page_excerpt": "日本全国の行政書士をお探しいただけます。主な取扱い業務などの一定の条件から検索することも可能です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 34,
      "code": "jicpa",
      "name_ja": "公認会計士検索",
      "name_en": "JICPA Search",
      "category": "professional",
      "is_active": true,
      "base_url": "https://registry.jicpa.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本公认会计士相关检索入口的登记项，用于查询会计师或相关法人；与专门 registry 登记分开。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:08.584415+00:00",
        "url": "https://registry.jicpa.or.jp/",
        "final_url": "https://registry.jicpa.or.jp/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 35,
      "code": "zeirishi",
      "name_ja": "税理士情報検索",
      "name_en": "Tax Accountant Search",
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.zeirishikensaku.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "税理士相关公开检索来源，提供税理士与税理士法人身份、事务所等信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:09.308142+00:00",
        "url": "https://www.zeirishikensaku.jp/",
        "final_url": "https://www.zeirishikensaku.jp/",
        "page_title": "税理士情報検索サイト - トップ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 36,
      "code": "diet_shugiin",
      "name_ja": "衆議院議員一覧",
      "name_en": "House of Representatives",
      "category": "pep",
      "is_active": true,
      "base_url": "https://www.shugiin.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "众议院官方议员名录，提供议员姓名、选区、所属等公开身份资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:12.343464+00:00",
        "url": "https://www.shugiin.go.jp/",
        "final_url": "http://www.shugiin.go.jp/internet/index.nsf/html/index.htm",
        "page_title": "衆議院トップページ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 37,
      "code": "diet_sangiin",
      "name_ja": "参議院議員一覧",
      "name_en": "House of Councillors",
      "category": "pep",
      "is_active": true,
      "base_url": "https://www.sangiin.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "参议院官方议员名录，提供议员姓名、选区、所属等公开身份资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:10.373984+00:00",
        "url": "https://www.sangiin.go.jp/",
        "final_url": "https://www.sangiin.go.jp/",
        "page_title": "参議院",
        "page_excerpt": "参議院のホームページです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 38,
      "code": "courts",
      "name_ja": "裁判所 判例検索",
      "name_en": "Courts in Japan",
      "category": "litigation",
      "is_active": true,
      "base_url": "https://www.courts.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本裁判所的公开判例检索入口，提供公开裁判文书、案件及裁判信息，不代表全国全部诉讼记录。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:12.343499+00:00",
        "url": "https://www.courts.go.jp/",
        "final_url": "https://www.courts.go.jp/",
        "page_title": "裁判所 - Courts in Japan",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 39,
      "code": "ip_courts",
      "name_ja": "知的財産高等裁判所",
      "name_en": "IP High Court",
      "category": "litigation",
      "is_active": true,
      "base_url": "https://www.ip.courts.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "知识产权高等裁判所公开判决及案件相关资料，用于研究知识产权诉讼。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:12.343534+00:00",
        "url": "https://www.ip.courts.go.jp/",
        "final_url": "https://www.courts.go.jp/ip/",
        "page_title": "知的財産高等裁判所",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 40,
      "code": "jplatpat",
      "name_ja": "J-PlatPat",
      "name_en": "J-PlatPat",
      "category": "ip",
      "is_active": true,
      "base_url": "https://www.j-platpat.inpit.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本专利信息平台，提供专利、实用新型、外观设计和商标检索及相关文献信息。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:11.316363+00:00",
        "url": "https://www.j-platpat.inpit.go.jp/",
        "final_url": "https://www.j-platpat.inpit.go.jp/",
        "page_title": "j-platpat",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 41,
      "code": "fsa_registry",
      "name_ja": "金融商品取引業者登録一覧",
      "name_en": "FSA Registered Operators",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/menkyo/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅金融商品交易业者登记名录，提供获登记经营者的身份、所在地和登记信息。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:11.638112+00:00",
        "url": "https://www.fsa.go.jp/menkyo/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 42,
      "code": "crypto_registry",
      "name_ja": "暗号資産交換業者登録一覧",
      "name_en": "Crypto Exchange Registry",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/menkyo/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅加密资产交换业者登记名录，提供获登记企业、登记编号及相关业务资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:11.662935+00:00",
        "url": "https://www.fsa.go.jp/menkyo/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 43,
      "code": "loan_registry",
      "name_ja": "登録貸金業者検索",
      "name_en": "Money Lender Registry",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "注册放贷业者检索服务，提供经营者名称、所在地和登记资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:11.836880+00:00",
        "url": "https://www.fsa.go.jp/ordinary/kensaku/",
        "final_url": "https://www.fsa.go.jp/ordinary/kensaku/",
        "page_title": "登録貸金業者情報検索サービス ： 金融庁",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 44,
      "code": "takken_registry",
      "name_ja": "建設業者・宅建業者検索",
      "name_en": "Construction/Real Estate Registry",
      "category": "license",
      "is_active": true,
      "base_url": "https://etsuran2.mlit.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省建设及宅建业者检索系统，提供经营者、许可或免许、所在地等公开登记资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:12.343582+00:00",
        "url": "https://etsuran2.mlit.go.jp/",
        "final_url": "https://etsuran2.mlit.go.jp:443/TAKKEN/",
        "page_title": "国土交通省 | 閲覧メニュー",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 45,
      "code": "mlit_jidosha",
      "name_ja": "国交省 自動車事業者処分",
      "name_en": null,
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省汽车运输业者处分检索，涵盖客运、货运等经营者的行政处分。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:12.779717+00:00",
        "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
        "final_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
        "page_title": "事業用自動車の安全対策 ｜ 自動車総合安全情報",
        "page_excerpt": "国土交通省自動車交通局の提供するサイトです。自動車交通の安全を目指した取り組みや交通事故被害者救済対策の紹介をしています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 46,
      "code": "jsda_actions",
      "name_ja": "日本証券業協会 会員処分",
      "name_en": "JSDA Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.jsda.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本証券業協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:12.874527+00:00",
        "url": "https://www.jsda.or.jp/",
        "final_url": "https://www.jsda.or.jp/",
        "page_title": "日本証券業協会",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 47,
      "code": "jfsa_loan_actions",
      "name_ja": "日本貸金業協会 会員処分",
      "name_en": "Japan Loan Assoc. Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.j-fsa.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本貸金業協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:13.071700+00:00",
        "url": "https://www.j-fsa.or.jp/",
        "final_url": "https://www.j-fsa.or.jp/",
        "page_title": "日本貸金業協会 | 貸金業に安心と信頼を。",
        "page_excerpt": "貸金業に安心と信頼を。貸金業界の自主規制機能を担う日本貸金業協会です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 48,
      "code": "zentaku_actions",
      "name_ja": "全国宅地建物取引業協会連合会 会員処分",
      "name_en": "Zentaku Renren Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.zentaku.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "全国宅地建物取引業協会連合会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:13.620685+00:00",
        "url": "https://www.zentaku.or.jp/",
        "final_url": "https://www.zentaku.or.jp/",
        "page_title": "全宅連 | 全国宅地建物取引業協会連合会",
        "page_excerpt": " 全国宅地建物取引業協会連合会（全宅連）の公式サイトです。全宅連では国民の住生活の安定向上と、適正な不動産取引の確保を念願し、不動産流通の活性化に努めています。人と住まいをつなぎます　すまい探しはハトマーク 全国宅地建物取引業協会連合会（全宅連）の公式サイトです。全宅連では国民の住生活の安定向上と、適正な不動産取引の確保を念願し、不動産流通の活性化に努めてい",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 49,
      "code": "retpc_actions",
      "name_ja": "不動産流通推進センター 処分",
      "name_en": "Real Estate Transaction Promotion Center Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.retpc.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "不動産流通推進センター 処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:13.981649+00:00",
        "url": "https://www.retpc.jp/",
        "final_url": "https://www.retpc.jp/",
        "page_title": "公益財団法人不動産流通推進センター",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 50,
      "code": "seiho_actions",
      "name_ja": "生命保険協会 会員処分",
      "name_en": "Life Insurance Assoc. Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.seiho.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "生命保険協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:14.016007+00:00",
        "url": "https://www.seiho.or.jp/",
        "final_url": "https://www.seiho.or.jp/",
        "page_title": "一般社団法人生命保険協会【公式ホームページ】",
        "page_excerpt": "日本国内で営業している生命保険会社が加盟する業界団体、生命保険協会の公式ホームページです。生命保険協会は、生命保険事業の健全な発達および信頼牲の維持を図ることを目的として各種事業を行っています。 日本国内で営業している生命保険会社が加盟する業界団体、生命保険協会の公式ホームページです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 51,
      "code": "sonpo_actions",
      "name_ja": "日本損害保険協会 会員処分",
      "name_en": "GIAJ Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.sonpo.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本損害保険協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:14.284099+00:00",
        "url": "https://www.sonpo.or.jp/",
        "final_url": "https://www.sonpo.or.jp/",
        "page_title": "日本損害保険協会",
        "page_excerpt": "日本損害保険協会では損害保険の普及啓発、相談対応、苦情・紛争の解決（そんぽADRセンター）、事故・災害・犯罪の防止・軽減などの活動を行っています。 日本損害保険協会では損害保険の普及啓発、相談対応、苦情・紛争の解決（そんぽADRセンター）、事故・災害・犯罪の防止・軽減などの活動を行っています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 52,
      "code": "toushin_actions",
      "name_ja": "投資信託協会 会員処分",
      "name_en": "Investment Trusts Assoc. Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.toushin.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "投資信託協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:14.835057+00:00",
        "url": "https://www.toushin.or.jp/",
        "final_url": "https://www.imaj.or.jp/",
        "page_title": "資産運用業協会",
        "page_excerpt": "資産運用業協会は、資産運用業の改革と高度化への取り組みを通じて、国民の健全な資産形成と持続可能な社会の実現を目指しています。 資産運用業協会は、資産運用業の改革と高度化への取り組みを通じて、国民の健全な資産形成と持続可能な社会の実現を目指しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 53,
      "code": "jvcea_actions",
      "name_ja": "日本暗号資産取引業協会 自主規制処分",
      "name_en": "JVCEA Self-Regulation Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://jvcea.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本暗号資産取引業協会 自主規制処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:15.634156+00:00",
        "url": "https://jvcea.or.jp/",
        "final_url": "https://jvcea.or.jp/",
        "page_title": "一般社団法人日本暗号資産等取引業協会（JVCEA）",
        "page_excerpt": "一般社団法人日本暗号資産等取引業協会は、暗号資産交換業及び暗号資産関連デリバティブ取引業の自主規制団体であり、資金決済法に基づく「認定資金決済事業者協会」と金融商品取引法に基づく「認定金融商品取引業協会」を兼ねております。 一般社団法人日本暗号資産等取引業協会は、暗号資産交換業及び暗号資産関連デリバティブ取引業の自主規制団体であり、資金決済法に基づく「認定資",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 54,
      "code": "pcaj_actions",
      "name_ja": "日本資金決済業協会 会員処分",
      "name_en": "PCAJ Member Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.s-kessai.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本資金決済業協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:15.660384+00:00",
        "url": "https://www.s-kessai.jp/",
        "final_url": "https://www.s-kessai.jp/",
        "page_title": "一般社団法人日本資金決済業協会",
        "page_excerpt": "商品券やプリカなどの前払式支払手段発行業および資金移動サービス（資金移動業）の健全な発展と利用者利益の保護を図ることを目的に活動する一般社団法人日本資金決済業協会のホームページ 商品券やプリカなどの前払式支払手段発行業および資金移動サービス（資金移動業）の健全な発展と利用者利益の保護を図ることを目的に活動する一般社団法人日本資金決済業協会のホームページ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 55,
      "code": "t2fifa_actions",
      "name_ja": "第二種金融商品取引業協会 会員処分",
      "name_en": "Type II Financial Instruments Firms Assoc. Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.t2fifa.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "第二種金融商品取引業協会 会員処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:16.264629+00:00",
        "url": "https://www.t2fifa.or.jp/",
        "final_url": "https://www.t2fifa.or.jp/",
        "page_title": "一般社団法人 第二種金融商品取引業協会",
        "page_excerpt": "（一社）第二種金融商品取引業協会は、ファンドの自己募集及び信託受益権の売買等業務に関する自主規制機能と業界団体的機能を担う金融商品取引法上の認定金融商品取引業協会です。 （一社）第二種金融商品取引業協会は、ファンドの自己募集及び信託受益権の売買等業務に関する自主規制機能と業界団体的機能を担う金融商品取引法上の認定金融商品取引業協会です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 56,
      "code": "zenginkyo_actions",
      "name_ja": "全国銀行協会 自主規制処分",
      "name_en": "Zenginkyo Self-Regulation Sanctions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.zenginkyo.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "全国銀行協会 自主規制処分的来源登记，用于追踪相应行业的公开处分或监管事项；当前入口可能仅为机构主页，具体公告见程序请求地址。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:16.271685+00:00",
        "url": "https://www.zenginkyo.or.jp/",
        "final_url": "https://www.zenginkyo.or.jp/",
        "page_title": "一般社団法人 全国銀行協会",
        "page_excerpt": "全国銀行協会（全銀協）のウェブサイトです。全銀協は、日本国内で活動している銀行を直接の会員とする組織で、わが国の銀行業界の代表として、銀行業の発展のためにさまざまな活動をしています。 全国銀行協会（全銀協）のウェブサイトです。全銀協は、日本国内で活動している銀行を直接の会員とする組織で、わが国の銀行業界の代表として、銀行業の発展のためにさまざまな活動をしてい",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 57,
      "code": "sec_aaer",
      "name_ja": "SEC 会計監査関連処分（AAER）",
      "name_en": "SEC Accounting and Auditing Enforcement Releases",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.sec.gov/divisions/enforce/friactions",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "美国证券交易委员会会计与审计执法公告，包含涉案主体、事项和执法结果。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:16.445036+00:00",
        "url": "https://www.sec.gov/divisions/enforce/friactions",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 58,
      "code": "doj_fcpa",
      "name_ja": "米司法省 FCPA 関連処分",
      "name_en": "DOJ FCPA Related Enforcement Actions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "美国司法部海外反腐败法相关执法资料，包含企业案件、指控和处置结果。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:16.539855+00:00",
        "url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 59,
      "code": "eu_antitrust",
      "name_ja": "欧州委員会 反トラスト・カルテル決定",
      "name_en": "EU Commission Antitrust / Cartel Decisions",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "欧盟委员会反垄断和卡特尔案件资料，包含企业、决定和处罚信息。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:17.060287+00:00",
        "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 60,
      "code": "uk_fca",
      "name_ja": "英国 FCA 行政処分",
      "name_en": "UK Financial Conduct Authority Enforcement",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.fca.org.uk/news/enforcement",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "英国金融行为监管局的监管及执法公告，包含受监管企业和处理结果。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:17.317921+00:00",
        "url": "https://www.fca.org.uk/news/enforcement",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 61,
      "code": "npo_houjin",
      "name_ja": "NPO 法人ポータルサイト (内閣府)",
      "name_en": "NPO Portal (Cabinet Office)",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.npo-homepage.go.jp/npoportal/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "内阁府 NPO 法人门户，公开非营利法人名称、地址、代表人和活动等资料，并提供批量下载。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:17.892158+00:00",
        "url": "https://www.npo-homepage.go.jp/npoportal/",
        "final_url": "https://www.npo-homepage.go.jp/npoportal/",
        "page_title": "NPO法人ポータルサイト - 内閣府",
        "page_excerpt": "NPO(Non Profit Organization)法人の検索・閲覧システム。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 62,
      "code": "kaigo_jigyosho",
      "name_ja": "厚労省 介護サービス情報公表",
      "name_en": null,
      "category": "license",
      "is_active": true,
      "base_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "介护服务信息公示平台，提供护理服务事业所、服务类型、运营主体及联系方式等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:17.945860+00:00",
        "url": "https://www.kaigokensaku.mhlw.go.jp/",
        "final_url": "https://www.kaigokensaku.mhlw.go.jp/",
        "page_title": "介護事業所・生活関連情報検索「介護サービス情報公表システム」",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 63,
      "code": "zeirishi_chokai",
      "name_ja": "税理士懲戒処分公告",
      "name_en": null,
      "category": "enforcement",
      "is_active": true,
      "base_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅税理士及税理士法人惩戒公告，公开处分对象、内容和日期。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:27:12.343659+00:00",
        "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
        "final_url": "https://www.nta.go.jp/error/404.htm",
        "page_title": "指定されたページを表示できませんでした",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 70,
      "code": "kanpo_tremolo",
      "name_ja": "官報決算データサービス (tremolo)",
      "name_en": "Kanpo Kessan Data Service",
      "category": "finance",
      "is_active": true,
      "base_url": "https://kanpo.tremolo.work/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "第三方官报决算公告汇总服务，以企业和会计期间组织官报财务公告；与官方官报全文站点区分。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:18.204683+00:00",
        "url": "https://kanpo.tremolo.work/",
        "final_url": "https://kanpo.tremolo.work/",
        "page_title": "官報決算データサービス",
        "page_excerpt": "官報に掲載された決算公告のデータサービスです。 官報に掲載された決算公告のデータサービスです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 109,
      "code": "prtimes",
      "name_ja": "PR TIMES プレスリリース",
      "name_en": "PR TIMES Press Releases",
      "category": "media",
      "is_active": true,
      "base_url": "https://prtimes.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "企业新闻稿发布平台，公开企业发布的产品、合作、活动及经营消息；内容属于发布方披露。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:18.474419+00:00",
        "url": "https://prtimes.jp/",
        "final_url": "https://prtimes.jp/",
        "page_title": "PR TIMES｜プレスリリース・ニュースリリースNo.1配信サービス",
        "page_excerpt": "プレスリリースをPR TIMESで配信して、効果的なPRを実現。上場企業の65.6％(2,646社／4,035社)が利用する現在シェアNo.1のプレスリリース配信代行サービス。話題のベンチャー～グローバル企業のニュースリリースが集まる生活者も要注目のサイトです。プレスリリースの受信は無料です。 プレスリリースをPR TIMESで配信して、効果的なPRを実現。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 110,
      "code": "kenko_keiei",
      "name_ja": "健康経営優良法人認定 (経産省/日本健康会議)",
      "name_en": "Kenko Keiei Yuryo Hojin Certification",
      "category": "license",
      "is_active": true,
      "base_url": "https://kenko-keiei.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "健康经营优良法人认定相关网站，公开认定制度和认定企业名单，用于补充企业健康经营资质。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:18.706227+00:00",
        "url": "https://kenko-keiei.jp/",
        "final_url": "https://kenko-keiei.jp/",
        "page_title": "ACTION！健康経営｜ポータルサイト（健康経営優良法人認定制度）",
        "page_excerpt": "日本の健康経営を推進するポータルサイト。健康経営優良法人認定制度における申請受付をはじめ、健康経営銘柄・健康経営優良法人認定企業の紹介、事例やデータ等を掲載。運営事務局である日本経済新聞社の情報力を活かし、ワークエンゲージメントやプレゼンティーズムと企業価値向上の追求、データ公開も積極的に行っていきます。 日本の健康経営を推進するポータルサイト。健康経営優良",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 111,
      "code": "jclp",
      "name_ja": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "name_en": "Japan Climate Leaders Partnership",
      "category": "license",
      "is_active": true,
      "base_url": "https://japan-clp.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本气候领导者伙伴关系的组织及会员信息，体现企业参与气候倡议的情况。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:18.886065+00:00",
        "url": "https://japan-clp.jp/",
        "final_url": "https://japan-clp.jp/",
        "page_title": "ホーム | JCLP | 日本気候リーダーズ・パートナーシップ",
        "page_excerpt": "JCLPは、「脱炭素社会」への移行をビジネス視点でとらえる日本独自の企業グループです。脱炭素社会の実現に向け、個別企業の枠を超えた活動に取り組んでいます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 112,
      "code": "gbizinfo_html",
      "name_ja": "gBizINFO 法人プロフィール HTML",
      "name_en": "gBizINFO Company Profile HTML",
      "category": "company",
      "is_active": true,
      "base_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "gBizINFO 的法人资料网页入口，展示法人档案和关联信息，可作为企业官网及代表人等线索来源。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:19.501371+00:00",
        "url": "https://info.gbiz.go.jp/hojin/ichiran",
        "final_url": "https://info.gbiz.go.jp/hojin/ichiran",
        "page_title": "法人プロフィール | Gビズインフォ",
        "page_excerpt": "Gビズインフォは経済産業省による、500万社以上の政府保有法人データ提供サイトです。 Gビズインフォは経済産業省による、500万社以上の政府保有法人データ提供サイトです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 114,
      "code": "benrishi_navi",
      "name_ja": "弁理士ナビ",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.benrishi-navi.com/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本弁理士会官方专利代理人检索服务，提供个人弁理士、事务所及专业信息。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:13.999892+00:00",
        "url": "https://www.benrishi-navi.com/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 503: Service Unavailable",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 115,
      "code": "tsr_bankruptcy",
      "name_ja": "TSR速報 (倒産情報)",
      "name_en": null,
      "category": "risk",
      "is_active": true,
      "base_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "东京商工研究公开的破产速报，介绍企业破产、债务和相关经营背景，属于商业机构报道。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:20.275550+00:00",
        "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
        "final_url": "https://www.tsr-net.co.jp/news/tsr/",
        "page_title": "TSR速報 | 倒産・注目企業情報 | 東京商工リサーチ",
        "page_excerpt": "東京商工リサーチ（TSR）が速報で配信する最新の倒産・注目企業の信用変動情報。負債総額が原則30億円以上の大型倒産情報および話題の注目企業の信用変動情報を速報でお伝えいたします 東京商工リサーチ（TSR）が速報で配信する最新の倒産・注目企業の信用変動情報。負債総額が原則30億円以上の大型倒産情報および話題の注目企業の信用変動情報を速報でお伝えいたします",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 116,
      "code": "bengoshikai",
      "name_ja": "ひまわりサーチ",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.bengoshikai.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "律师会提供的ひまわりサーチ律师信息服务，收录自愿登记律师的事务所及专业资料，不等于全体律师名册。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:20.445892+00:00",
        "url": "https://www.bengoshikai.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 123,
      "code": "jicpa_registry",
      "name_ja": "日本公認会計士協会 公認会計士等検索システム",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://registry.jicpa.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本公认会计士协会的专门登记检索系统，公开会计师及审计法人等登记资料。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:20.674034+00:00",
        "url": "https://registry.jicpa.or.jp/",
        "final_url": "https://registry.jicpa.or.jp/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 124,
      "code": "courts_hanrei",
      "name_ja": "裁判所判例検索",
      "name_en": null,
      "category": "risk",
      "is_active": true,
      "base_url": "https://www.courts.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "裁判所公开判例库，提供案件名称、案号、裁判日期、法院及判决 PDF；企业当事人识别需进一步解析文书。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:14.792591+00:00",
        "url": "https://www.courts.go.jp/",
        "final_url": "https://www.courts.go.jp/",
        "page_title": "裁判所 - Courts in Japan",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 134,
      "code": "invoice_kohyo",
      "name_ja": "適格請求書発行事業者公表サイト",
      "name_en": null,
      "category": "registry",
      "is_active": true,
      "base_url": "https://www.invoice-kohyo.nta.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅合格请求书发行事业者公示平台，提供发票登记编号、登记状态、名称及相关公示资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:20.950751+00:00",
        "url": "https://www.invoice-kohyo.nta.go.jp/",
        "final_url": "https://www.invoice-kohyo.nta.go.jp/",
        "page_title": "国税庁インボイス制度適格請求書発行事業者公表サイト",
        "page_excerpt": "このサイトでは、適格請求書発行事業者の登録を受けている事業者の情報を公表しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 141,
      "code": "seiji_shikin",
      "name_ja": "政治資金収支報告書",
      "name_en": "Soumu Political Funds Reports",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "总务省等公开的政治资金收支报告，包含政治团体和资金收支文件；捐款明细需解析报告。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:21:21.149367+00:00",
        "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
        "final_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
        "page_title": "Request Rejected",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 142,
      "code": "edinet_officers",
      "name_ja": "EDINET 役員一覧 (有報)",
      "name_en": null,
      "category": "company",
      "is_active": true,
      "base_url": null,
      "url_note": "登记表未提供可用 HTTP(S) URL；可能为派生来源或动态入口",
      "description": {
        "summary": "EDINET 有价证券报告书中的役员资料这一逻辑来源，包含姓名、职务及履历等信息，并非独立网站。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:21:21.345957+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 143,
      "code": "wikidata_houjin",
      "name_ja": "Wikidata 法人番号 LOD",
      "name_en": "Wikidata Corporate Number LOD",
      "category": "company",
      "is_active": true,
      "base_url": "https://query.wikidata.org/sparql",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "Wikidata 中以日本法人编号关联的开放知识数据，提供实体标识及部分外部属性，属于社区维护数据。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:21.345988+00:00",
        "url": "https://query.wikidata.org/sparql",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "The read operation timed out",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 144,
      "code": "ofac_indirect",
      "name_ja": "OFAC 50%ルール 間接保有 (派生)",
      "name_en": "OFAC 50% Rule indirect ownership (derived)",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "依据制裁主体股权与持股关系推导的间接控制风险登记，属于派生信息，不是独立官方制裁名单。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:14.817329+00:00",
        "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
        "final_url": "https://wc2h-sls-prod-public-published.s3.us-gov-west-1.amazonaws.com/Published/d1a49dd0-69e4-491f-b779-7601744c2459/2026-10-27/5fbdd3eb-577a-4a44-ad04-9c51885340c9/SDN.XML",
        "page_title": "Director of PALESTINE LIBERATION FRONT - ABU ABBAS FACTION Chief Ideological Figure of ISLAMIC GAMA'AT Operational and Military Leader of JIHAD GROUP Chief Ideological Figure of PALESTINIAN ISLAMIC JIHAD - SHIQAQI Leading Ideological Figure of HIZBALLAH Secretary General of DEMOCRATIC FRONT FOR THE LIBERATION OF PALESTINE - HAWATMEH FACTION Military Leader of ISLAMIC GAMA'AT Secretary General of POPULAR FRONT FOR THE LIBERATION OF PALESTINE - GENERAL COMMAND Principal Deputy of POPULAR FRONT FOR THE LIBERATION OF PALESTINE - GENERAL COMMAND Secretary General of Hizballah Former Secretary General and Current Senior Figure of HIZBALLAH Political Leader in Amman, Jordan and Damascus, Syria for HAMAS Secretary General of the PALESTINIAN ISLAMIC JIHAD Commander of the Faithful (\"Amir al-Munineen\")",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 146,
      "code": "kaigo_facilities",
      "name_ja": "厚労省 介護サービス情報公表システム オープンデータ",
      "name_en": null,
      "category": "license",
      "is_active": true,
      "base_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省发布的介护服务公示开放数据，按事业所提供服务、地址及运营主体等结构化信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:22.027839+00:00",
        "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
        "final_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
        "page_title": "介護サービスの情報公表システム　オープンデータ｜厚生労働省",
        "page_excerpt": "介護サービス情報公表システムの事業所データをcsvファイルとして提供します。 介護サービス情報公表システムの事業所データをcsvファイルとして提供します。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 147,
      "code": "shougai_fukushi",
      "name_ja": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "name_en": null,
      "category": "license",
      "is_active": true,
      "base_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "WAM 障碍福祉服务开放数据，提供服务设施、服务类别、地址和运营法人等结构化资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:22.100520+00:00",
        "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
        "final_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
        "page_title": "障害福祉サービス等情報公表システムデータのオープンデータ",
        "page_excerpt": "障害福祉サービス等情報公表システムデータのオープンデータ（2025年9月末追加）",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 148,
      "code": "crypto_exchange_fsa",
      "name_ja": "暗号資産交換業者一覧 (取扱資産含む)",
      "name_en": "FSA Crypto Exchange Registry (with supported assets)",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅公开的加密资产交换业者 PDF 名录，除登记及联系方式外，还包含扱取加密资产等资料。",
        "basis": "登记入口是数据文件；本次未将二进制文件当作网页正文解析。",
        "website_review": "file_entry",
        "checked_at": "2026-11-02T11:21:22.658009+00:00",
        "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
        "final_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "文件型入口，未将二进制当作网页正文",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 149,
      "code": "hotel_ryokan_intl",
      "name_ja": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "name_en": "Registered Hotels and Ryokans under the International Tourist Hotel Development Law",
      "category": "license",
      "is_active": true,
      "base_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国际观光酒店整备法下的注册酒店及旅馆名单，反映该特定制度下的登记情况。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:22.661878+00:00",
        "url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
        "final_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
        "page_title": "データセット\n | e-Govデータポータル",
        "page_excerpt": "データカタログに登録済みのデータセットの詳細、リソースの一覧を表示します。 国際観光ホテル整備法に基づいて登録されたホテル・旅館の一覧をダウンロードすることができます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 150,
      "code": "dx_nintei",
      "name_ja": "DX認定事業者 (IPA / 経産省)",
      "name_en": "DX-Certified Enterprises (IPA / METI)",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "IPA 的 DX 认定公开平台，提供获认定经营者、认定期间、法人编号和企业属性等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:23.088422+00:00",
        "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
        "final_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
        "page_title": "DX認定制度 認定事業者検索 - DX推進ポータル",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 151,
      "code": "sec_20f",
      "name_ja": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "name_en": "SEC EDGAR Japan-listed (Form 20-F)",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.sec.gov/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "美国 SEC EDGAR 中日本在美上市或 ADR 企业的 Form 20-F 等披露文件，用于跨境上市和披露关联。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:23.395355+00:00",
        "url": "https://www.sec.gov/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 152,
      "code": "youth_yell",
      "name_ja": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "name_en": "Youth Yell certified companies (MHLW)",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省青年雇佣促进网站的 Youth Yell 认定企业信息，包含企业及青年就业相关公开资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:23.601977+00:00",
        "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
        "final_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/top.action",
        "page_title": "若者雇用促進総合サイト｜厚生労働省",
        "page_excerpt": "新卒、大卒、高卒の若者が就職支援に積極的な優良企業を検索することができる厚生労働省が運用する企業データベース『若者雇用促進総合サイト』です。ユースエール認定が職場情報、企業情報、学卒求人を多数掲載しております。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 153,
      "code": "sbt_certified",
      "name_ja": "SBT (Science Based Targets) 認定企業 — 日本",
      "name_en": "Science Based Targets — Japanese Companies",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "Science Based Targets initiative 的企业气候目标状态数据，包含企业、地区及目标承诺或认定状态。",
        "basis": "登记入口是数据文件；本次未将二进制文件当作网页正文解析。",
        "website_review": "file_entry",
        "checked_at": "2026-11-02T11:21:24.109887+00:00",
        "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
        "final_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "文件型入口，未将二进制当作网页正文",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 154,
      "code": "shokuhin_eisei",
      "name_ja": "食品衛生申請等システム (食品営業許可・届出)",
      "name_en": "Food Hygiene Business Licenses (MHLW + Municipal Open Data)",
      "category": "license",
      "is_active": true,
      "base_url": "https://i2fas.mhlw.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "食品卫生申请系统公开的食品营业许可及申报信息，用于了解食品经营设施和许可情况。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:24.222824+00:00",
        "url": "https://i2fas.mhlw.go.jp/",
        "final_url": "https://i2fas.mhlw.go.jp/",
        "page_title": "食品衛生公開[メニュー]",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 155,
      "code": "mhlw_koyou_fraud",
      "name_ja": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "name_en": "MHLW Koyou Subsidy Fraud Disclosure (47 Prefectural Labor Bureaus)",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省及地方劳动局公布的雇佣类助成金不正领取案件，包含企业与处理信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:24.551947+00:00",
        "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
        "final_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
        "page_title": "雇用調整助成金　不正受給｜厚生労働省",
        "page_excerpt": "雇用調整助成金の不正受給に関する紹介ページ 雇用調整助成金の不正受給に関する紹介ページ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 156,
      "code": "construction_licenses",
      "name_ja": "建設業者 全国 (国交省 + 47都道府県)",
      "name_en": null,
      "category": "license",
      "is_active": true,
      "base_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省建设业者检索名录，提供许可编号、代表人、地址、资本金及许可业务类别等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:15.225827+00:00",
        "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
        "final_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
        "page_title": "国土交通省 | 建設業者 検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 157,
      "code": "keidanren_members",
      "name_ja": "経団連 会員一覧",
      "name_en": "Keidanren Member List",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经团联公开的会员名单，用于识别企业与经济团体的会员关系。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:25.393100+00:00",
        "url": "https://www.keidanren.or.jp/profile/kaiin/",
        "final_url": "https://www.keidanren.or.jp/profile/kaiin/",
        "page_title": "会員一覧 | 経団連について | 一般社団法人 日本経済団体連合会 / Keidanren",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 158,
      "code": "tcfd_supporters",
      "name_ja": "TCFD賛同企業・機関 (経産省)",
      "name_en": "TCFD Supporters in Japan (METI)",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "TCFD 支持企业和机构相关名单，反映对气候财务披露框架的支持，不能等同于认证。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:25.742495+00:00",
        "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
        "final_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
        "page_title": "日本のTCFD賛同企業・機関 （METI/経済産業省）",
        "page_excerpt": "温暖化対策,地球,CO2,,政策,経済産業省,METI",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 159,
      "code": "partnership_declaration",
      "name_ja": "パートナーシップ構築宣言",
      "name_en": "Partnership Building Declaration",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.biz-partnership.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "伙伴关系构筑宣言平台，公开企业宣言与基本资料，反映企业在供应链合作方面的自主声明。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:25.753651+00:00",
        "url": "https://www.biz-partnership.jp/",
        "final_url": "https://www.biz-partnership.jp/",
        "page_title": "「パートナーシップ構築宣言」ポータルサイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 160,
      "code": "edinet_foreign_capital_derived",
      "name_ja": "EDINET 大株主から導出した外資出資情報",
      "name_en": "Foreign Capital Signal Derived From EDINET Large Shareholders",
      "category": "derived",
      "is_active": true,
      "base_url": null,
      "url_note": "登记表未提供可用 HTTP(S) URL；可能为派生来源或动态入口",
      "description": {
        "summary": "从 EDINET 股东数据推导的外资出资信息，属于内部加工结果，依赖股东识别与分类。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:21:26.189362+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 161,
      "code": "school_institution",
      "name_ja": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "name_en": "MEXT School Code Master (All Japan)",
      "category": "institution",
      "is_active": true,
      "base_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "文部科学省学校代码数据，按学校提供代码、名称、学校类型和所在地等基础资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:15.348442+00:00",
        "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
        "final_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
        "page_title": "文部科学省　学校コード：文部科学省",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 162,
      "code": "daigaku_hatsu_vc",
      "name_ja": "大学発ベンチャーデータベース",
      "name_en": "METI University Startup Database",
      "category": "company",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省大学衍生创业企业数据库，包含企业、关联大学、业务、代表人及部分经营属性。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:26.396540+00:00",
        "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
        "final_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
        "page_title": "大学発ベンチャーデータベース（METI/経済産業省）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 163,
      "code": "yakkyoku_registry",
      "name_ja": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "name_en": "Pharmacy Registry (47 prefectures + designated cities)",
      "category": "license",
      "is_active": true,
      "base_url": "https://data.bodik.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "各自治体药局开设许可开放数据的汇总来源登记，面向药局名称、地址与许可信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:26.857922+00:00",
        "url": "https://data.bodik.jp/",
        "final_url": "https://data.bodik.jp/",
        "page_title": "ようこそ - CKAN",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 164,
      "code": "medical_facilities",
      "name_ja": "医療機能情報提供制度 全国オープンデータ",
      "name_en": "Medical Function Information System (National Open Data)",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省医疗功能信息开放数据，提供医院、诊疗所等医疗机构的设施与服务资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:26.994355+00:00",
        "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
        "final_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
        "page_title": "医療情報ネットのオープンデータ｜厚生労働省",
        "page_excerpt": "本ページでは、医療情報ネットのオープンデータを公表します。 本ページでは、医療情報ネットのオープンデータを公表します。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 166,
      "code": "eco_action21",
      "name_ja": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "name_en": "EcoAction21 Certified Businesses (MOE / IPSuS)",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.ea21.jp/register/ninsho_search/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "Eco Action 21 环境经营认证登记信息，包含获认证经营者、编号及相关公开名单。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:27.329244+00:00",
        "url": "https://www.ea21.jp/register/ninsho_search/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 177,
      "code": "nadeshiko_meigara",
      "name_ja": "なでしこ銘柄 (経産省+TSE)",
      "name_en": null,
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省与交易所遴选的女性活跃推进相关上市公司名单，反映特定年度的入选情况。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:27.662632+00:00",
        "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
        "final_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
        "page_title": "女性活躍に優れた上場企業を選定「なでしこ銘柄」 （METI/経済産業省）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 178,
      "code": "kenko_keiei_meigara",
      "name_ja": "健康経営銘柄 (経産省+TSE)",
      "name_en": null,
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省与交易所遴选的健康经营相关上市公司名单，反映特定年度的入选情况。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:27.696050+00:00",
        "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
        "final_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
        "page_title": "健康経営銘柄（METI/経済産業省）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 258,
      "code": "fben",
      "name_ja": "福岡県弁護士会 弁護士検索",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.fben.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "福冈县律师会律师检索，提供会员律师与事务所资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:27.789162+00:00",
        "url": "https://www.fben.jp/",
        "final_url": "https://www.fben.jp/",
        "page_title": "福岡県弁護士会　不安を、安心に。",
        "page_excerpt": "福岡県弁護士会。基本的人権を擁護し、社会正義を実現することが弁護士の使命です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 259,
      "code": "satsuben",
      "name_ja": "札幌弁護士会 弁護士検索",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.satsuben.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "札幌律师会律师检索，提供会员律师与事务所资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:15.672753+00:00",
        "url": "https://www.satsuben.or.jp/",
        "final_url": "https://satsuben.or.jp/",
        "page_title": "札幌弁護士会ホームページ",
        "page_excerpt": "札幌弁護士会（札弁）のホームペ－ジにようこそ。法律問題でお困りの方へ「 法律相談センター 」のご案内、弁護士を探している方へ「 弁護士検索 」、札幌弁護士会の活動案内や弁護士コラム、市民のみなさまのお役に立つ情報満載です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 260,
      "code": "niigata_bengo",
      "name_ja": "新潟県弁護士会 弁護士検索",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.niigata-bengo.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "新潟县律师会律师名录，提供律师姓名、事务所与联系资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:28.384012+00:00",
        "url": "https://www.niigata-bengo.or.jp/",
        "final_url": "https://niigata-bengo.or.jp/",
        "page_title": "新潟県弁護士会",
        "page_excerpt": "新潟県弁護士会のWebサイトへようこそ。家庭や学校での問題、交通事故やお金にまつわること、むずかしい法律のお話など、こんなことでも大丈夫かな？と思う前に、当会までお気軽にご相談ください。当会弁護士が親身になって、みなさまの悩みを解決するお手伝いをいたします。 新潟県弁護士会のWebサイトへようこそ。家庭や学校での問題、交通事故やお金にまつわること、むずかしい",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 265,
      "code": "security_companies",
      "name_ja": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "name_en": "Certified Security Companies (Prefectural Police)",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "都道府县公安委员会或警察公开的警备业认定业者名单，用于核对特定地区的行业认定。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:29.047816+00:00",
        "url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
        "final_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
        "page_title": "警備業に関する主な申請手続の概要について | 広島県警察",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 266,
      "code": "travel_agencies",
      "name_ja": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "name_en": "Travel Agency Registry (JTA + Prefectures)",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "观光厅及都道府县公开的旅行相关经营者注册名录，涉及旅行社、代理及服务安排业务。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:29.050635+00:00",
        "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
        "final_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
        "page_title": "旅行業法 | 観光政策・制度 | 観光庁",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 267,
      "code": "temp_staffing_registry",
      "name_ja": "労働者派遣事業所登録",
      "name_en": "Temporary Staffing Operators Registry",
      "category": "license",
      "is_active": true,
      "base_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省人材服务综合网站的劳务派遣事业所登记信息，包含事业所和许可等资料。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:21:29.066480+00:00",
        "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
        "final_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
        "page_title": "セキュリティー：人材サービス総合サイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 268,
      "code": "job_placement_registry",
      "name_ja": "有料職業紹介事業所登録",
      "name_en": "Paid Job Placement Operators Registry",
      "category": "license",
      "is_active": true,
      "base_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省人材服务综合网站的收费职业介绍事业所登记信息，包含经营者和许可等资料。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:21:29.635827+00:00",
        "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
        "final_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
        "page_title": "セキュリティー：人材サービス総合サイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 269,
      "code": "real_estate_appraisers",
      "name_ja": "不動産鑑定業者名簿 (国交省)",
      "name_en": "Real Estate Appraisers Registry (MLIT)",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省不动产鉴定业者名录，提供经营者、所在地和登记信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:30.320729+00:00",
        "url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
        "final_url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
        "page_title": "土地・不動産・建設業：不動産鑑定業者の事業実績 - 国土交通省",
        "page_excerpt": "国土交通省のウェブサイトです。政策、報道発表資料、統計情報、各種申請手続きに関する情報などを掲載しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 270,
      "code": "edinet_officer_changes",
      "name_ja": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "name_en": "EDINET Officer Resignation/Appointment (Extraordinary Report, doc_type 180)",
      "category": "corporate",
      "is_active": true,
      "base_url": "https://api.edinet-fsa.go.jp/api/v2",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "EDINET 临时报告书中的役员异动披露，反映董事等役员的任免和变更。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:30.332693+00:00",
        "url": "https://api.edinet-fsa.go.jp/api/v2",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.\nThe last 30x error message was:\nRedirect",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 271,
      "code": "osakaben",
      "name_ja": "大阪弁護士会 会員検索",
      "name_en": null,
      "category": "professional",
      "is_active": true,
      "base_url": "https://www.osakaben.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "大阪律师会会员检索，提供律师姓名、事务所、地址及联系方式等公开资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:15.963908+00:00",
        "url": "https://www.osakaben.or.jp/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1010)>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 274,
      "code": "jcia_cosmetics",
      "name_ja": "日本化粧品工業会 会員企業一覧",
      "name_en": "JCIA Member Companies",
      "category": "industry_assoc",
      "is_active": true,
      "base_url": "https://www.jcia.org/admin/memberlist",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本化妆品工业会公开会员名单，反映协会会员身份，不能单独当作行政许可。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:30.641402+00:00",
        "url": "https://www.jcia.org/admin/memberlist",
        "final_url": "https://www.jcia.org/home/",
        "page_title": "日本化粧品工業会 | 日本化粧品工業会Japan Cosmetic Industry Association　公式ホームページ　JCIA.ORG",
        "page_excerpt": "日本化粧品工業会（粧工会）は東京、中部、西日本の３工業会により、化粧品工業の発展、国民生活の向上を目標に1959年7月に設立された団体です。日本国内だけでなく海外も視野に入れた活動を展開しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 275,
      "code": "jaha_animal_hospitals",
      "name_ja": "JAHA認定動物病院一覧",
      "name_en": "JAHA Certified Animal Hospitals",
      "category": "industry_assoc",
      "is_active": true,
      "base_url": "https://animal-hospital.jaha.or.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本动物医院协会公开的认证动物医院名单，反映该协会的认证及设施信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:30.726600+00:00",
        "url": "https://animal-hospital.jaha.or.jp/",
        "final_url": "https://animal-hospital.jaha.or.jp/",
        "page_title": "動物病院検索サイト｜ 公益社団法人日本動物病院協会",
        "page_excerpt": "日本動物病院協会に加盟する全国700を超える動物病院の中から、信頼できる動物病院がきっと見つかる！エリアや認定の有無などから、病院情報や求人情報を検索いただけます。動物病院探しにご活用ください。 日本動物病院協会に加盟する全国700を超える動物病院の中から、信頼できる動物病院がきっと見つかる！エリアや認定の有無などから、病院情報や求人情報を検索いただけます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 277,
      "code": "nta_houjin_api_v1",
      "name_ja": "国税庁 法人番号 Web-API v4",
      "name_en": "NTA Corporate Number Web-API v4",
      "category": "corporate_registry",
      "is_active": true,
      "base_url": "https://api.houjin-bangou.nta.go.jp/4",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅法人编号 Web API v4，支持按法人编号及差分取得法人基本资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:31.527702+00:00",
        "url": "https://api.houjin-bangou.nta.go.jp/4",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 278,
      "code": "invoice_kohyo_api_v1",
      "name_ja": "国税庁 適格請求書発行事業者 Web-API v1",
      "name_en": "NTA Invoice Issuer Web-API v1",
      "category": "registry",
      "is_active": true,
      "base_url": "https://web-api.invoice-kohyo.nta.go.jp/1/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国税厅合格请求书事业者 Web API，支持按登记编号及变更差分取得发票登记资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:31.740664+00:00",
        "url": "https://web-api.invoice-kohyo.nta.go.jp/1/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: ",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 279,
      "code": "virtual_office_operators",
      "name_ja": "日本主要虚拟办公室运营商一覧",
      "name_en": "Japan virtual-office operator footprints",
      "category": "commercial_directory",
      "is_active": true,
      "base_url": "https://www.regus.co.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "多个虚拟办公室及共享办公运营商的公开网点资料集合，提供网点名称、地址和服务线索。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:32.072447+00:00",
        "url": "https://www.regus.co.jp/",
        "final_url": "https://www.regus.co.jp/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 526,
      "code": "company_geocode",
      "name_ja": "企業所在地ジオコーディング",
      "name_en": "Company Headquarters Geocoding",
      "category": "derived",
      "is_active": true,
      "base_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "将企业地址转换为坐标的地理编码逻辑来源，使用国土地理院等查询结果，坐标质量依赖地址和匹配方式。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:32.526649+00:00",
        "url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
        "final_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 529,
      "code": "company_location_profile",
      "name_ja": "企業所在地・不動産環境プロファイル",
      "name_en": "Company Location Real Estate Profile",
      "category": "derived",
      "is_active": true,
      "base_url": null,
      "url_note": "登记表未提供可用 HTTP(S) URL；可能为派生来源或动态入口",
      "description": {
        "summary": "结合企业坐标及不动产空间数据形成的所在地环境画像，属于内部派生来源。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:21:33.184628+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 902,
      "code": "company_website_data",
      "name_ja": "公式サイト会社概要",
      "name_en": "Company website profile",
      "category": "company",
      "is_active": true,
      "base_url": null,
      "url_note": "逐企业官网 URL，保存在 companies.website_url；登记 URL 不代表全部网站",
      "description": {
        "summary": "逐家企业官方网站的公司概要及相关子页面集合，提供企业自述业务、代表人、地址、招聘和沿革等信息。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:21:33.184670+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 915,
      "code": "enecho_retail_electric",
      "name_ja": "資源エネルギー庁 登録小売電気事業者一覧",
      "name_en": "ANRE Registered Retail Electricity Suppliers",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "资源能源厅注册零售电力事业者名单，提供经营者及登记相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:33.184684+00:00",
        "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
        "final_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
        "page_title": "登録小売電気事業者一覧｜電気事業制度の概要｜資源エネルギー庁",
        "page_excerpt": "経済産業省・資源エネルギー庁のホームページです。登録小売電気事業者一覧、登録特定送配電事業者一覧。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 969,
      "code": "enecho_retail_gas",
      "name_ja": "資源エネルギー庁 登録ガス小売事業者一覧",
      "name_en": "ANRE Registered Retail Gas Suppliers",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "资源能源厅注册燃气零售事业者名单，提供经营者及登记相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:33.381651+00:00",
        "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
        "final_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
        "page_title": "登録ガス小売事業者｜ガス事業制度について｜資源エネルギー庁",
        "page_excerpt": "経済産業省・資源エネルギー庁のホームページです。ガス事業制度について、登録ガス小売事業者。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 980,
      "code": "jgoodtech",
      "name_ja": "J-GoodTech 公開企業プロフィール",
      "name_en": "J-GoodTech public company profiles",
      "category": "business_matching",
      "is_active": true,
      "base_url": "https://jgoodtech.smrj.go.jp",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "中小企业基盘整备机构 J-GoodTech 的公开企业档案，介绍企业业务、技术、产品和基本资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:33.840304+00:00",
        "url": "https://jgoodtech.smrj.go.jp",
        "final_url": "https://jgoodtech.smrj.go.jp/pub/en/",
        "page_title": "Your best business matching platform | J-GoodTech",
        "page_excerpt": "Your best business matching platform | J-GoodTech Find business partners, grow your professional network and successfully implement your ideas and projects.",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1049,
      "code": "meti_alcohol",
      "name_ja": "経済産業省 アルコール事業者名簿",
      "name_en": "METI Alcohol Business Operator Lists",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/policy/alcohol/openlist/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省酒精事业经营者名录，提供许可或登记经营者及相关业务资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:34.268947+00:00",
        "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1292,
      "code": "moj_registered_support_org",
      "name_ja": "出入国在留管理庁 登録支援機関登録簿",
      "name_en": "Immigration Services Agency Registered Support Organization List",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "出入国在留管理厅注册支援机构名簿，公开机构、代表人、所在地及支援相关信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:34.339785+00:00",
        "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
        "final_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
        "page_title": "登録支援機関(Registered Support Organization) | 出入国在留管理庁",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1546,
      "code": "pmark_jmra",
      "name_ja": "JMRA プライバシーマーク付与適格決定事業者一覧",
      "name_en": "JMRA PrivacyMark Decision List",
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本市场调查协会公开的 PrivacyMark 相关经营者名单，提供企业及隐私标志审查资格信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:34.808785+00:00",
        "url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
        "final_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
        "page_title": "プライバシーマーク付与適格決定事業者一覧",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1817,
      "code": "fsa_money_lender",
      "name_ja": "金融庁 登録貸金業者情報検索サービス",
      "name_en": "FSA Registered Money Lender Search Service",
      "category": "license",
      "is_active": true,
      "base_url": "https://clearing.fsa.go.jp/kashikin/index.php",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅注册放贷业者检索，提供业者身份、代表人、地址及登记资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:35.187727+00:00",
        "url": "https://clearing.fsa.go.jp/kashikin/index.php",
        "final_url": "https://clearing.fsa.go.jp/kashikin/index.php",
        "page_title": "検索入力ページ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1821,
      "code": "isico_dgnet",
      "name_ja": "ISICO DGnet 企業情報",
      "name_en": "ISICO DGnet Company Directory",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.isico.or.jp/company/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "石川县产业创出支援机构的公开企业档案，包含企业、代表人、业务及联系资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:35.474730+00:00",
        "url": "https://www.isico.or.jp/company/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 503: Service Unavailable",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1824,
      "code": "mlit_chintai_management",
      "name_ja": "国土交通省 賃貸住宅管理業者検索",
      "name_en": "MLIT Rental Housing Management Business Search",
      "category": "license",
      "is_active": true,
      "base_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省租赁住宅管理业者检索，提供企业和注册资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:16.516481+00:00",
        "url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
        "final_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
        "page_title": "国土交通省 | 賃貸住宅管理業者 検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1825,
      "code": "mlit_mansion_management",
      "name_ja": "国土交通省 マンション管理業者検索",
      "name_en": "MLIT Condominium Management Business Search",
      "category": "license",
      "is_active": true,
      "base_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省公寓管理业者检索，提供企业和注册资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:16.874781+00:00",
        "url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
        "final_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
        "page_title": "国土交通省 | マンション管理業者 検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1826,
      "code": "mlit_jutaku_shukuhaku_management",
      "name_ja": "国土交通省 住宅宿泊管理業者検索",
      "name_en": "MLIT Private Lodging Management Business Search",
      "category": "license",
      "is_active": true,
      "base_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国土交通省住宅住宿管理业者检索，提供企业和注册资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:17.028264+00:00",
        "url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
        "final_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
        "page_title": "国土交通省 | 住宅宿泊管理業者 検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1827,
      "code": "tokyo_taishin_architect",
      "name_ja": "東京都木造住宅耐震診断事務所登録名簿",
      "name_en": "Tokyo Wooden-House Seismic Diagnosis Office Register",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "东京都木造住宅耐震诊断事务所登记名簿，提供事务所和经营者相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:37.022088+00:00",
        "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
        "final_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
        "page_title": "木造住宅の耐震診断事務所の登録・公表｜東京都耐震ポータル",
        "page_excerpt": "木造住宅の耐震診断事務所登録制度の概要、登録事務所の公表、制度の趣旨や利用方法をお知らせします。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1830,
      "code": "t2fifa_members",
      "name_ja": "第二種金融商品取引業協会 正会員名簿",
      "name_en": "Type II Financial Instruments Firms Association Members",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.t2fifa.or.jp/members/register/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "第二种金融商品交易业协会正式会员名录，反映会员身份及公开企业资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:37.132579+00:00",
        "url": "https://www.t2fifa.or.jp/members/register/",
        "final_url": "https://www.t2fifa.or.jp/members/register/",
        "page_title": "正会員名簿・検索｜一般社団法人 第二種金融商品取引業協会",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1831,
      "code": "jsda_members",
      "name_ja": "日本証券業協会 会員名簿",
      "name_en": "Japan Securities Dealers Association Member Lists",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本证券业协会会员名簿，包含会员公司基本信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:37.379828+00:00",
        "url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
        "final_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
        "page_title": "協会員名簿 | 日本証券業協会",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1834,
      "code": "imaj_advice_disclosure",
      "name_ja": "資産運用業協会 投資助言・代理会員台帳",
      "name_en": "Asset Management Association of Japan Investment Advice Member Disclosure",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.imaj.or.jp/members/disclosure/advice/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "资产运用业协会投资建议及代理会员公开台账，提供企业及代表人等披露信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:37.533166+00:00",
        "url": "https://www.imaj.or.jp/members/disclosure/advice/",
        "final_url": "https://www.imaj.or.jp/members/disclosure/advice/",
        "page_title": "投資助言・代理会員台帳｜資産運用業協会",
        "page_excerpt": "投資助言・代理会員の概況をまとめています。 投資助言・代理会員の概況をまとめています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1835,
      "code": "imaj_investment_management_disclosure",
      "name_ja": "資産運用業協会 投資運用会社要覧",
      "name_en": "Asset Management Association of Japan Investment Management Disclosure",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "资产运用业协会投资运用公司公开要览，提供企业及管理层等披露信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.387071+00:00",
        "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
        "final_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
        "page_title": "投資運用会社要覧｜資産運用業協会",
        "page_excerpt": "投資一任業・不動産関連特定投資運用業・ラップ業務・ファンド運用業を行う会員の概況をまとめています。 投資一任業・不動産関連特定投資運用業・ラップ業務・ファンド運用業を行う会員の概況をまとめています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1836,
      "code": "koeki_info_representatives",
      "name_ja": "公益法人information 公益法人等詳細",
      "name_en": "Koeki Hojin Information Public Corporation Details",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "公益法人信息系统的法人详情，包含公益法人及相关法人基本资料和代表人线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.387734+00:00",
        "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
        "final_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
        "page_title": "国・都道府県公式公益法人行政総合情報サイト 公益法人information",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1840,
      "code": "wam_social_welfare_current_report",
      "name_ja": "WAM NET 社会福祉法人 現況報告書",
      "name_en": "WAM NET Social Welfare Corporation Current Status Reports",
      "category": "disclosure",
      "is_active": true,
      "base_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "WAM 社会福祉法人现况报告公开系统，提供法人资料及理事等现况报告信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.589793+00:00",
        "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
        "final_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
        "page_title": "社会福祉法人の現況報告書等情報検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1844,
      "code": "kumamoto_religious_corporations",
      "name_ja": "熊本県 宗教法人名簿",
      "name_en": "Kumamoto Prefecture Religious Corporation List",
      "category": "directory",
      "is_active": true,
      "base_url": "https://data.bodik.jp/dataset/430005_00107",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "熊本县公开的宗教法人名簿，提供法人及代表役员等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.876795+00:00",
        "url": "https://data.bodik.jp/dataset/430005_00107",
        "final_url": "https://data.bodik.jp/dataset/430005_00107",
        "page_title": "宗教法人名簿 - データセット - CKAN",
        "page_excerpt": "宗教法人の名簿",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1847,
      "code": "molink_company_profiles",
      "name_ja": "木材SCM支援システム もりんく 事業者詳細",
      "name_en": "molink Wood SCM Support System Company Profiles",
      "category": "directory",
      "is_active": true,
      "base_url": "https://molink.jp/search",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "木材供应链支援系统もりんく的公开经营者档案，提供企业、业务及代表人等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.980001+00:00",
        "url": "https://molink.jp/search",
        "final_url": "https://molink.jp/search",
        "page_title": "事業者・製品検索｜木材SCM支援システム【もりんく】",
        "page_excerpt": "取引先を地域や製品等から検索し、コンタクトをとることができます。 取引先を地域や製品等から検索し、コンタクトをとることができます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1859,
      "code": "kokodesearch_childcare_facility_csv",
      "name_ja": "ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV",
      "name_en": "Kokode Search Childcare Facility Public CSV",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "WAM 这里de搜索儿童保育设施公开 CSV，提供设施、运营主体及相关基本资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:38.985352+00:00",
        "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
        "final_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
        "page_title": "ここdeサーチ",
        "page_excerpt": "ここdeサーチ。子ども・子育て支援情報公表システム。全国の教育・保育施設検索サイト。こどもこそだての情報は「ここdeサーチ」で！",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1863,
      "code": "university_portrait_private_school",
      "name_ja": "大学ポートレート（私学版）法人情報",
      "name_en": "University Portrait Private School Corporation Information",
      "category": "directory",
      "is_active": true,
      "base_url": "https://up-j.shigaku.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "大学 Portrait 私学版的学校及法人资料，包含办学法人和理事长等信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:17.450010+00:00",
        "url": "https://up-j.shigaku.go.jp/",
        "final_url": "https://up-j.shigaku.go.jp/",
        "page_title": "大学ポートレート（私学版）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1867,
      "code": "gunma_medical_corporation_reports",
      "name_ja": "群馬県医療法人事業報告書等",
      "name_en": "Gunma Medical Corporation Business Reports",
      "category": "official_report",
      "is_active": true,
      "base_url": "https://www.pref.gunma.jp/page/716575.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "群馬県公开的医疗法人事业或决算报告，包含法人经营资料及理事长等代表人线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:39.240965+00:00",
        "url": "https://www.pref.gunma.jp/page/716575.html",
        "final_url": "https://www.pref.gunma.jp/page/716575.html",
        "page_title": "医療法人の決算届（事業報告書等）の閲覧について - 群馬県ホームページ(医務課)",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 1880,
      "code": "saitama_medical_corporation_reports",
      "name_ja": "埼玉県医療法人決算届",
      "name_en": "Saitama Medical Corporation Closing Reports",
      "category": "official_report",
      "is_active": true,
      "base_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "埼玉県公开的医疗法人事业或决算报告，包含法人经营资料及理事长等代表人线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:39.611601+00:00",
        "url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
        "final_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
        "page_title": "医療法人決算届（令和6年4月期～令和7年3月期） - 埼玉県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 8985,
      "code": "soumu_registered_telecom",
      "name_ja": "総務省 登録電気通信事業者一覧",
      "name_en": "MIC Registered Telecommunications Operators List",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "总务省注册电信事业者名单，提供经营者及登记资料。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:21:40.356473+00:00",
        "url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
        "final_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
        "page_title": "Request Rejected",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 9577,
      "code": "medical_info_net_pharmacy",
      "name_ja": "厚生労働省 医療情報ネット 薬局詳細",
      "name_en": "MHLW Medical Information Net Pharmacy Details",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省医疗信息网的药局详情检索入口，提供药局、经营主体和服务相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:40.634981+00:00",
        "url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
        "final_url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
        "page_title": "機関詳細情報｜医療情報ネット｜厚生労働省",
        "page_excerpt": "このページは医療情報ネットの医療機関の機関情報詳細ページです。医療情報ネットは厚生労働省・都道府県が運営する全国の病院、診療所、歯科診療所、助産所や全国の薬局を診療科目、診療日、都道府県、市区町村や路線、外国語などで絞り込み、検索することができるサイトです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10182,
      "code": "sme_ma_support_institution",
      "name_ja": "中小企業庁 M&A支援機関登録制度 登録支援機関データベース",
      "name_en": "SME Agency M&A Support Institution Registry",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://ma-shienkikan.go.jp/search",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "中小企业厅 M&A 支援机构注册数据库，提供已注册支援机构及其公开经营资料。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:17.866352+00:00",
        "url": "https://ma-shienkikan.go.jp/search",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1010)>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10192,
      "code": "ur_qualified_suppliers",
      "name_ja": "UR都市機構 有資格者名簿",
      "name_en": "UR Qualified Supplier Public Lists",
      "category": "supplier_registry",
      "is_active": true,
      "base_url": "https://www.ur-net.go.jp/order/procedure.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "UR 都市机构采购有资格者名单，公开供应商资格和企业相关资料。",
        "basis": "返回拒绝或错误页面；未将响应视为业务内容确认。",
        "website_review": "error_page",
        "checked_at": "2026-11-02T11:21:40.906157+00:00",
        "url": "https://www.ur-net.go.jp/order/procedure.html",
        "final_url": "https://www.ur-net.go.jp/order/procedure.html",
        "page_title": "Request Rejected",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10194,
      "code": "nexco_east_qualified_suppliers",
      "name_ja": "NEXCO東日本 有資格者情報検索",
      "name_en": "NEXCO East Qualified Supplier Search",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "NEXCO 东日本采购有资格者检索，提供具备其采购资格的供应商资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:41.008766+00:00",
        "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
        "final_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
        "page_title": "有資格者情報検索｜調達情報｜NEXCO 東日本",
        "page_excerpt": "有資格者情報検索 有資格者情報検索",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10195,
      "code": "nexco_west_qualified_suppliers",
      "name_ja": "NEXCO西日本 有資格者名簿",
      "name_en": "NEXCO West Qualified Supplier Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "NEXCO 西日本采购有资格者名簿，提供具备其采购资格的供应商资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:41.231011+00:00",
        "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
        "final_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
        "page_title": "有資格者名簿【工事・調査等】について | NEXCO西日本",
        "page_excerpt": "競争参加資格の有資格者名簿の一覧です。 競争参加資格の有資格者名簿の一覧です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10196,
      "code": "hanshin_expressway_qualified_suppliers",
      "name_ja": "阪神高速道路 有資格者名簿",
      "name_en": "Hanshin Expressway Qualified Supplier Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "阪神高速道路采购有资格者名单，提供供应商及采购资格相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:41.528367+00:00",
        "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
        "final_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
        "page_title": "★有資格者名簿（２０２４年６月３日現在） | 阪神高速道路 企業情報サイト",
        "page_excerpt": "阪神高速道路の★有資格者名簿（２０２４年６月３日現在）のページです。阪神高速道路は、様々な取り組みを通じて、お客さまの満足を実現し、関西のくらしや経済の発展に貢献できるよう取り組んでいます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10208,
      "code": "freight_debt_watchlists",
      "name_ja": "国際物流 債務不履行ウォッチリスト",
      "name_en": "Freight Debt Watchlists",
      "category": "credit_risk",
      "is_active": true,
      "base_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "国际物流行业的债务违约观察名单，包含被报道或列示的经营者，属于第三方线索，需核实实体和事实。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:42.032520+00:00",
        "url": "https://fdrs-ltd.com/delinquent-debtors/",
        "final_url": "https://fdrs-ltd.com/delinquent-debtors/",
        "page_title": "FDRS Warninglist A to Z – FDRS-Ltd | Freight Debt Recovery Service",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10210,
      "code": "seikei_bankruptcies",
      "name_ja": "セイケイデータ 不渡り・倒産情報",
      "name_en": "Seikei Data Dishonor and Bankruptcy Notices",
      "category": "credit_risk",
      "is_active": true,
      "base_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "Seikei Data 公开的不渡票据及破产信息，作为企业经营风险报道来源。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:42.292957+00:00",
        "url": "https://www.seikei.co.jp/information/bankruptcies/",
        "final_url": "https://www.seikei.co.jp/information/bankruptcies/",
        "page_title": "不渡り・倒産情報 - 株式会社セイケイデータ",
        "page_excerpt": "弊社情報会員向けのシークレット情報、倒産速報で掲載している不渡り・倒産情報の一部を公開しています。 弊社情報会員向けのシークレット情報、倒産速報で掲載している不渡り・倒産情報の一部を公開しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 10212,
      "code": "tdb_bankruptcy_flash",
      "name_ja": "帝国データバンク 倒産速報",
      "name_en": "Teikoku Databank Bankruptcy Flash",
      "category": "risk",
      "is_active": true,
      "base_url": "https://www.tdb.co.jp/report/search/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "帝国数据库公开的破产速报和调查报道，提供企业、破产程序及债务等线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:42.687104+00:00",
        "url": "https://www.tdb.co.jp/report/search/",
        "final_url": "https://www.tdb.co.jp/report/search/",
        "page_title": "レポート記事｜株式会社 帝国データバンク[TDB]",
        "page_excerpt": "「TDB景気動向調査」協力企業限定のコンテンツです。同調査の詳細データや、景況感に関する企業の生の声など、他では得られない一次情報をご覧いただけます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 12707,
      "code": "chiba_sanpai_waste_licensees",
      "name_ja": "千葉県 産業廃棄物処理業者名簿",
      "name_en": "Chiba Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "千葉県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:43.013847+00:00",
        "url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
        "final_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
        "page_title": "産業廃棄物処理業者名簿／千葉県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 13690,
      "code": "kanagawa_sanpai_waste_licensees",
      "name_ja": "神奈川県 産業廃棄物処理業者名簿",
      "name_en": "Kanagawa Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "神奈川県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:17.866529+00:00",
        "url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
        "final_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
        "page_title": "産業廃棄物処理業者名簿 - 神奈川県ホームページ",
        "page_excerpt": "産業廃棄物処理業者名簿 産業廃棄物処理業者名簿",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 14402,
      "code": "tochigi_sanpai_waste_licensees",
      "name_ja": "栃木県 産業廃棄物処理業者名簿",
      "name_en": "Tochigi Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "栃木県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:43.802456+00:00",
        "url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
        "final_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
        "page_title": "栃木県／産業廃棄物処理業者名簿",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 14406,
      "code": "yamagata_sanpai_waste_licensees",
      "name_ja": "山形県 産業廃棄物処理業者名簿",
      "name_en": "Yamagata Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "山形県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:44.506343+00:00",
        "url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
        "final_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
        "page_title": "県（全体）業者名簿 | 山形県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 14726,
      "code": "ishikawa_sanpai_waste_licensees",
      "name_ja": "石川県 産業廃棄物処理業者名簿",
      "name_en": "Ishikawa Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "石川県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:44.770274+00:00",
        "url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
        "final_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
        "page_title": "産業廃棄物許可業者等名簿 | 石川県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15145,
      "code": "fukui_sanpai_waste_licensees",
      "name_ja": "福井県 産業廃棄物処理業者名簿",
      "name_en": "Fukui Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "福井県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:45.141662+00:00",
        "url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
        "final_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
        "page_title": "福井県産業廃棄物処理業者名簿（２０２６年３月３１日現在）  | 福井県ホームページ",
        "page_excerpt": "福井県公式サイト。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15147,
      "code": "gifu_sanpai_waste_licensees",
      "name_ja": "岐阜県 産業廃棄物処理業者名簿",
      "name_en": "Gifu Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.gifu.lg.jp/page/3670.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "岐阜県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:18.114281+00:00",
        "url": "https://www.pref.gifu.lg.jp/page/3670.html",
        "final_url": "https://www.pref.gifu.lg.jp/page/3670.html",
        "page_title": "産業廃棄物（特別管理産業廃棄物）処理業者許可情報 - 岐阜県公式ホームページ（廃棄物対策課）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15151,
      "code": "niigata_sanpai_waste_licensees",
      "name_ja": "新潟県 産業廃棄物処理業者名簿",
      "name_en": "Niigata Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "新潟県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:45.777525+00:00",
        "url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
        "final_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
        "page_title": "排出事業者の方へ（産業廃棄物の適正処理・処理業者一覧） - 新潟県ホームページ",
        "page_excerpt": "排出事業者の方へ（産業廃棄物の適正処理、処理業者一覧について）",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15153,
      "code": "toyama_sanpai_waste_licensees",
      "name_ja": "富山県 産業廃棄物処理業者名簿",
      "name_en": "Toyama Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "富山県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:18.497303+00:00",
        "url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
        "final_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
        "page_title": "富山県／産業廃棄物処理業許可業者について",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15157,
      "code": "nagano_sanpai_waste_licensees",
      "name_ja": "長野県 産業廃棄物処理業者名簿",
      "name_en": "Nagano Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "長野県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:45.905617+00:00",
        "url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
        "final_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
        "page_title": "長野県産業廃棄物処理業者名簿／長野県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15160,
      "code": "aichi_sanpai_waste_licensees",
      "name_ja": "愛知県 産業廃棄物処理業者名簿",
      "name_en": "Aichi Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "愛知県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:46.348914+00:00",
        "url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 403: Forbidden",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15162,
      "code": "yamanashi_sanpai_waste_licensees",
      "name_ja": "山梨県 産業廃棄物処理業者名簿",
      "name_en": "Yamanashi Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "山梨県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:46.713937+00:00",
        "url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
        "final_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
        "page_title": "山梨県／産業廃棄物処理業者名簿",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15166,
      "code": "iwate_sanpai_waste_licensees",
      "name_ja": "岩手県 産業廃棄物処理業者名簿",
      "name_en": "Iwate Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "岩手県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:18.536881+00:00",
        "url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
        "final_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
        "page_title": "岩手県 - 岩手県産業廃棄物処理業者名簿",
        "page_excerpt": "岩手県",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 15168,
      "code": "aomori_alis_supporter",
      "name_ja": "青森県総合社会教育センター 学校教育サポーター",
      "name_en": "Aomori ALIS School Supporter Directory",
      "category": "directory",
      "is_active": true,
      "base_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "青森县综合社会教育中心的学校教育支援者公开资料，包含参与机构及公开联系信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:46.980339+00:00",
        "url": "https://www.alis.pref.aomori.lg.jp/supporter/",
        "final_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 16900,
      "code": "osaka_sanpai_waste_licensees",
      "name_ja": "大阪府 産業廃棄物処理業者名簿",
      "name_en": "Osaka Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "大阪府公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:18.617280+00:00",
        "url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
        "final_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
        "page_title": "産業廃棄物処理業者名簿／大阪府（おおさかふ）ホームページ [Osaka Prefectural Government]",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 16911,
      "code": "fukuoka_medical_corporation_reports",
      "name_ja": "福岡県医療法人事業報告書等",
      "name_en": "Fukuoka Medical Corporation Business Reports",
      "category": "official_report",
      "is_active": true,
      "base_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "福岡県公开的医疗法人事业或决算报告，包含法人经营资料及理事长等代表人线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:47.858504+00:00",
        "url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
        "final_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
        "page_title": "医療法人の事業報告書等の閲覧について（県庁医療指導課所管分） - 福岡県庁ホームページ",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 16935,
      "code": "osaka_medical_corporation_reports",
      "name_ja": "大阪府医療法人事業報告書等",
      "name_en": "Osaka Medical Corporation Business Reports",
      "category": "official_report",
      "is_active": true,
      "base_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "大阪府公开的医疗法人事业或决算报告，包含法人经营资料及理事长等代表人线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:18.794672+00:00",
        "url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
        "final_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
        "page_title": "決算書等の閲覧／大阪府（おおさかふ）ホームページ [Osaka Prefectural Government]",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17085,
      "code": "tokyo_sanpai_waste_licensees",
      "name_ja": "東京都 産業廃棄物処理業者情報検索",
      "name_en": "Tokyo Industrial Waste Licensee Search",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "東京都公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:48.422743+00:00",
        "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
        "final_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
        "page_title": "処理業者情報検索入力",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17093,
      "code": "tosankyo_members",
      "name_ja": "東京都産業資源循環協会 正会員名簿",
      "name_en": "Tokyo Industrial Waste Association Member List",
      "category": "industry_association",
      "is_active": true,
      "base_url": "https://tosankyo.or.jp/regular_member",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "东京都产业资源循环协会正式会员名簿，公开会员企业资料，协会会员身份与行政许可分开理解。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:48.816407+00:00",
        "url": "https://tosankyo.or.jp/regular_member",
        "final_url": "https://tosankyo.or.jp/regular_member",
        "page_title": "正会員名簿　[五十音順] – 一般社団法人 東京都産業資源循環協会",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17095,
      "code": "aomori_sanpai_association_members",
      "name_ja": "青森県産業資源循環協会 協会員名簿",
      "name_en": "Aomori Industrial Waste Association Member List",
      "category": "industry_association",
      "is_active": true,
      "base_url": "http://www.aosanpaikyou.or.jp/member-list",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "青森县产业资源循环协会会员名簿，提供会员企业及相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:48.933772+00:00",
        "url": "http://www.aosanpaikyou.or.jp/member-list",
        "final_url": "http://www.aosanpaikyou.or.jp/",
        "page_title": "一般社団法人 青森県産業資源循環協会",
        "page_excerpt": "一般社団法人 青森県産業資源循環協会のホームページです。組織概要、事業内容、講習会日程などをご案内致します。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17097,
      "code": "toyama_sanpai_association_members",
      "name_ja": "富山県産業資源循環協会 処理業許可業者名簿",
      "name_en": "Toyama Industrial Waste Association Disposal Companies",
      "category": "industry_association",
      "is_active": true,
      "base_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "富山县产业资源循环协会公开的处理业许可经营者名录，提供企业及许可相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:50.110470+00:00",
        "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
        "final_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
        "page_title": "会員名簿 | 一般社団法人　富山県産業資源循環協会",
        "page_excerpt": "富山県産業廃棄物協会では、産業廃棄物の適正処理を目指して県内の排出事業者及び処理業者に向け情報を発進すると共に、マニフェストや出版物の販売、講習会・申請業務等行っております。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17167,
      "code": "ehime_sanpai_waste_licensees",
      "name_ja": "愛媛県 産業廃棄物処理業者名簿",
      "name_en": "Ehime Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.ehime.jp/page/9773.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "愛媛県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:50.184192+00:00",
        "url": "https://www.pref.ehime.jp/page/9773.html",
        "final_url": "https://www.pref.ehime.jp/page/9773.html",
        "page_title": "産業廃棄物処理業者名簿 - 愛媛県庁公式ホームページ（循環型社会推進課）",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17173,
      "code": "kagawa_sanpai_waste_licensees",
      "name_ja": "香川県 産業廃棄物処理業者名簿",
      "name_en": "Kagawa Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "香川県公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:51.039790+00:00",
        "url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
        "final_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
        "page_title": "産業廃棄物｜香川県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17176,
      "code": "ibaraki_sanpai_excellent_waste_licensees",
      "name_ja": "茨城県 優良産廃処理業者認定業者一覧",
      "name_en": "Ibaraki Excellent Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "茨城県公开的获优良认定的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:51.044011+00:00",
        "url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
        "final_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
        "page_title": "優良産廃処理業者認定制度／茨城県",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17178,
      "code": "kagoshima_sanpai_excellent_waste_licensees",
      "name_ja": "鹿児島県 優良産廃処理業者認定基準適合処理業者一覧",
      "name_en": "Kagoshima Excellent Industrial Waste Licensee List",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "鹿児島県公开的获优良认定的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:51.535220+00:00",
        "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
        "final_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
        "page_title": "鹿児島県／優良産廃処理業者認定制度の概要・認定基準適合処理業者一覧",
        "page_excerpt": "鹿児島県の産業廃棄物処理業者の優良性認定制度についての説明 優良産廃処理業者認定制度の概要・認定基準適合処理業者一覧：鹿児島県の産業廃棄物処理業者の優良性認定制度についての説明",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17180,
      "code": "sakai_sanpai_waste_licensees",
      "name_ja": "堺市 産業廃棄物処理業者名簿",
      "name_en": "Sakai City Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "堺市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:51.650593+00:00",
        "url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
        "final_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
        "page_title": "堺市 産業廃棄物処理業者名簿　堺市",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17184,
      "code": "maebashi_sanpai_disposal_waste_licensees",
      "name_ja": "前橋市 産業廃棄物処分業者名簿",
      "name_en": "Maebashi Industrial Waste Disposal Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "前橋市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:52.341058+00:00",
        "url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
        "final_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
        "page_title": "産業廃棄物処理業者名簿／前橋市",
        "page_excerpt": " 前橋市における産業廃棄物（特別管理産業廃棄物）の収集運搬業者・処分業者の名称、住所、電話番号、取扱う産業廃棄物の種類などを掲載しています。なお、産業廃棄物処理（収集運搬、処分）業に関し優れた能力及び実績を有するとして本市が認定している事業者（優良認定事業者）は以下の事業者です。\t優良認定事業者（廃棄物処理法施行規則第9条の3、第10条の4の2）\t\t\t\t\t\t",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17188,
      "code": "osaka_city_sanpai_waste_licensees",
      "name_ja": "大阪市 産業廃棄物処理業者名簿",
      "name_en": "Osaka City Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "大阪市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:53.795435+00:00",
        "url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
        "final_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
        "page_title": "大阪市：大阪市(特別管理)産業廃棄物処理業者名簿 （…>廃棄物処理事業>産業廃棄物処理対策）",
        "page_excerpt": "　産業廃棄物の中間処理、収集運搬（積替・保管を含む）を業として行うため、大阪市が許可を出している業者の名簿です。 大阪市(特別管理)産業廃棄物処理業者名簿（令和8年9月30日時点）産業廃棄物収集運搬業（積替・保管を含む）業者名簿特別管理産..",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17190,
      "code": "takatsuki_sanpai_waste_licensees",
      "name_ja": "高槻市 産業廃棄物処理業者一覧",
      "name_en": "Takatsuki City Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "高槻市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:54.322999+00:00",
        "url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
        "final_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
        "page_title": "産業廃棄物処理業者一覧 - 高槻市ホームページ（資源循環推進課）",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17193,
      "code": "toyonaka_sanpai_waste_licensees",
      "name_ja": "豊中市 産業廃棄物処理業者一覧",
      "name_en": "Toyonaka City Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "豊中市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:54.406936+00:00",
        "url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
        "final_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
        "page_title": "処理業者一覧　豊中市",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17223,
      "code": "kaigo_service_public_detail",
      "name_ja": "介護サービス情報公表システム 事業所詳細",
      "name_en": "MHLW Kaigo Service Public Detail Pages",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "介护服务信息公示系统的事业所详情，包含设施及运营法人代表人等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:54.678904+00:00",
        "url": "https://www.kaigokensaku.mhlw.go.jp/",
        "final_url": "https://www.kaigokensaku.mhlw.go.jp/",
        "page_title": "介護事業所・生活関連情報検索「介護サービス情報公表システム」",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17232,
      "code": "wam_disability_public_detail",
      "name_ja": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "name_en": "WAM Disability Welfare Public Detail Pages",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.wam.go.jp/sfkohyoout/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "WAM 障碍福祉服务事业所详情，包含设施、服务及运营法人代表人等资料。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:54.997878+00:00",
        "url": "https://www.wam.go.jp/sfkohyoout/",
        "final_url": "https://www.wam.go.jp/sfkohyoout/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17436,
      "code": "local_public_recognitions",
      "name_ja": "地方自治体 表彰・受賞公告",
      "name_en": "Local Government Public Recognitions",
      "category": "public_recognition",
      "is_active": true,
      "base_url": null,
      "url_note": "登记表未提供可用 HTTP(S) URL；可能为派生来源或动态入口",
      "description": {
        "summary": "各地方自治体公开的表彰、获奖和显彰公告集合，用于识别企业所获地方公共荣誉。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:21:55.050931+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17438,
      "code": "kanpo_official",
      "name_ja": "官報発行サイト",
      "name_en": "Official Kanpo Publication Site",
      "category": "registry",
      "is_active": true,
      "base_url": "https://www.kanpo.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "现行官方官报发行网站，按发行日提供本纸、号外和政府采购等官报内容及 PDF。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:55.050963+00:00",
        "url": "https://www.kanpo.go.jp/",
        "final_url": "https://www.kanpo.go.jp/",
        "page_title": "官報",
        "page_excerpt": "内閣府の官報発行サイトです。直近90日分の官報（本紙、号外、政府調達公告等）を閲覧・ダウンロードできます。90日経過後の記事も、一部の記事を除き閲覧可能です。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17439,
      "code": "govbook_kanpo_index",
      "name_ja": "全国官報販売協同組合 官報目次検索",
      "name_en": "National Kanpo Sales Cooperative Kanpo TOC Search",
      "category": "registry",
      "is_active": true,
      "base_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "全国官报销售协同组合的官报目录检索，提供官报目次和内容发现入口，与官方正文来源区分。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:21:55.783790+00:00",
        "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 503: Service Temporarily Unavailable",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17440,
      "code": "catr_kanpo",
      "name_ja": "CatR 官報決算データベース",
      "name_en": "CatR Kanpo Financial Statements Database",
      "category": "finance",
      "is_active": true,
      "base_url": "https://catr.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "CatR 的第三方官报决算数据库，按企业和决算公告组织财务摘要及相关公告内容。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:56.183018+00:00",
        "url": "https://catr.jp/",
        "final_url": "https://catr.jp/",
        "page_title": "官報決算データベース | 決算公告・会社公告・企業情報",
        "page_excerpt": "官報に掲載された決算公告や、解散・合併・会社分割などの会社公告を確認できます。会社名・所在地・純利益・利益剰余金・総資産から決算公告を無料で検索し、会社情報、子会社・関連会社も確認できます。 官報に掲載された決算公告や、解散・合併・会社分割などの会社公告を確認できます。会社名・所在地・純利益・利益剰余金・総資産から決算公告を無料で検索し、会社情報、子会社・関",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17540,
      "code": "caa_no_trouble",
      "name_ja": "消費者庁 特定商取引法ガイド 執行事例検索",
      "name_en": "CAA No-Trouble Specified Commercial Transactions Enforcement Search",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.no-trouble.caa.go.jp/search/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "消费者厅特定商业交易法指南的执行案例检索，提供受处分经营者、案件与措施。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:27:18.826533+00:00",
        "url": "https://www.no-trouble.caa.go.jp/search/",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "<urlopen error [Errno 8] nodename nor servname provided, or not known>",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17541,
      "code": "npa_designated_boryokudan",
      "name_ja": "警察庁 指定暴力団一覧",
      "name_en": "NPA Designated Boryokudan Organizations",
      "category": "antisocial",
      "is_active": true,
      "base_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "警察厅公布的指定暴力团组织名单，属于公开组织事实资料，不直接证明某企业与组织有关。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:56.884662+00:00",
        "url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
        "final_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
        "page_title": "暴力団対策｜警察庁Webサイト",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17542,
      "code": "npa_wanted",
      "name_ja": "警察庁 指定重要指名手配",
      "name_en": "NPA Important Wanted Suspects",
      "category": "antisocial",
      "is_active": true,
      "base_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "警察厅指定重要通缉人员公告，提供公开通缉对象资料；姓名相似不能直接认定身份。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:57.183914+00:00",
        "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
        "final_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
        "page_title": "指名手配｜警察庁Webサイト",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17543,
      "code": "fcg_incidents",
      "name_ja": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "name_en": "Fujisankei Crisis Management Corporate Incident List",
      "category": "media",
      "is_active": true,
      "base_url": "https://www.fcg-r.co.jp/research/incident.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "富士产经危机管理研究室整理的企业事件及不祥事时间线，属于第三方研究线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:57.257720+00:00",
        "url": "https://www.fcg-r.co.jp/research/incident.html",
        "final_url": "https://www.fcg-r.co.jp/research/incident.html",
        "page_title": "企業事件・不祥事リスト | フジサンケイ危機管理研究室",
        "page_excerpt": "企業事件・不祥事の事例リスト。企業の危機管理・コンプライアンス対応の参考となる不祥事事例を随時更新しています。エフシージー総合研究所 フジサンケイ危機管理研究室。 企業事件・不祥事の事例リスト。企業の危機管理・コンプライアンス対応の参考となる不祥事事例を随時更新しています。エフシージー総合研究所 フジサンケイ危機管理研究室。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17544,
      "code": "psia_terror_orgs",
      "name_ja": "公安調査庁 国際テロリズム要覧",
      "name_en": "PSIA International Terrorism Handbook",
      "category": "antisocial",
      "is_active": true,
      "base_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "公安调查厅国际恐怖主义要览中的组织资料，提供组织和背景信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:57.427754+00:00",
        "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
        "final_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
        "page_title": "主な国際テロ組織等、世界の国際テロ組織等の概要及び最近の動向 | 国際テロリズム要覧について | 公安調査庁",
        "page_excerpt": "公安調査庁のウェブサイト",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17545,
      "code": "meti_foreign_user_list",
      "name_ja": "経産省 外国ユーザーリスト",
      "name_en": "METI Foreign End User List",
      "category": "sanction",
      "is_active": true,
      "base_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "经济产业省出口管理外国最终用户清单相关公告，作为出口管理审查线索，不能直接等同于全面制裁。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:57.942465+00:00",
        "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
        "final_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
        "page_title": "大量破壊兵器等の懸念又は通常兵器の開発等、取引状況等の確認を要する外国・地域所在団体の情報を提供する「外国ユーザーリスト」を改正しました（METI/経済産業省）",
        "page_excerpt": "経済産業省では、大量破壊兵器関連貨物等に係るキャッチオール規制※の実効性を向上させるため、輸出者に対し、大量破壊兵器等の開発等の懸念が払拭されない外国・地域所在団体の情報を提供する「外国ユーザーリスト」を公表しています。 今般、最新の情報をもとに当該リストを改正するとともに、通常兵器の開発等、取引状況等の確認を要する外国団体の情報も追加しました。本リストは、",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17646,
      "code": "kkj_bid_notices",
      "name_ja": "官公需情報ポータルサイト検索API 入札公告",
      "name_en": "KKJ Public Procurement Search API Bid Notices",
      "category": "tender",
      "is_active": true,
      "base_url": "https://www.kkj.go.jp/api/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "官公需信息门户的入札公告检索 API，提供政府及公共机构采购机会和公告链接。",
        "basis": "入口仅返回简短响应或页面框架；未核验动态检索内容。",
        "website_review": "shell_or_short_response",
        "checked_at": "2026-11-02T11:21:58.354437+00:00",
        "url": "https://www.kkj.go.jp/api/",
        "final_url": "https://www.kkj.go.jp/api/",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17656,
      "code": "jnet21_support_programs",
      "name_ja": "J-Net21 支援情報ヘッドライン 補助金・助成金・融資",
      "name_en": "J-Net21 Support Information Headlines",
      "category": "subsidy",
      "is_active": true,
      "base_url": "https://j-net21.smrj.go.jp/snavi2/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "J-Net21 支援信息头条，汇集补助金、助成金、融资及企业支援项目。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:58.425403+00:00",
        "url": "https://j-net21.smrj.go.jp/snavi2/",
        "final_url": "https://j-net21.smrj.go.jp/snavi2/",
        "page_title": "支援情報ヘッドライン | J-Net21[中小企業ビジネス支援サイト]",
        "page_excerpt": "中小企業・小規模事業者向けに、補助金や融資、税制優遇などの支援策を業種・地域・目的別に検索できる公的支援策の検索ツールです。 中小企業・小規模事業者向けに、補助金や融資、税制優遇などの支援策を業種・地域・目的別に検索できる公的支援策の検索ツールです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17666,
      "code": "yakuza_wiki",
      "name_ja": "YAKUZA WIKI 民間暴力団情報",
      "name_en": "YAKUZA WIKI Civilian Organized-Crime Wiki",
      "category": "media",
      "is_active": true,
      "base_url": "https://www.yakuza.wiki/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "民间维护的组织信息 Wiki，属于非官方线索，需要核实来源、身份和时效。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:58.436484+00:00",
        "url": "https://www.yakuza.wiki/",
        "final_url": "https://www.yakuza.wiki/",
        "page_title": "YAKUZA WIKI",
        "page_excerpt": "YAKUZA WIKIは、暴力団組織・人物・組織図などをはじめ、準暴力団、右翼団体、半グレなどを掲載。指定暴力団・指定外暴力団など各組織の情報が記載されたWikiサイトです。 YAKUZA WIKIは、暴力団組織・人物・組織図などをはじめ、準暴力団、右翼団体、半グレなどを掲載。指定暴力団・指定外暴力団など各組織の情報が記載されたWikiサイトです。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17669,
      "code": "yakuza_news",
      "name_ja": "暴力団ニュース～ヤクザ事件簿",
      "name_en": "Yakuza News anti-social incident articles",
      "category": "media",
      "is_active": true,
      "base_url": "https://www.yakuza-news.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "民间整理的暴力团相关新闻，属于新闻线索，需要核实报道与实体对应关系。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:58.565816+00:00",
        "url": "https://www.yakuza-news.jp/",
        "final_url": "https://www.yakuza-news.jp/",
        "page_title": "暴力団ニュース～ヤクザ事件簿 – 反社会勢力関連の事件・裁判・社会動向のまとめサイト",
        "page_excerpt": "反社会勢力関連の事件・裁判・社会動向のまとめサイト 反社会勢力関連の事件・裁判・社会動向のまとめサイト",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17675,
      "code": "prefectural_police_wanted",
      "name_ja": "都道府県警察 指名手配ページ",
      "name_en": "Prefectural police wanted/public-investigation pages",
      "category": "official",
      "is_active": true,
      "base_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "各都道府县警察公开的通缉页面集合，提供公开通缉信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:58.611025+00:00",
        "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
        "final_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
        "page_title": "都道府県警察の指名手配ページへのリンク｜警察庁Webサイト",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 17715,
      "code": "hojyokin_portal",
      "name_ja": "補助金ポータル 補助金・助成金・支援金",
      "name_en": "Hojyokin Portal Subsidy Directory",
      "category": "subsidy",
      "is_active": true,
      "base_url": "https://hojyokin-portal.jp/subsidies/list",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "民间补助金门户，汇集补助金、助成金和支援金项目，具体申请条件以实施机构公告为准。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:59.161989+00:00",
        "url": "https://hojyokin-portal.jp/subsidies/list",
        "final_url": "https://hojyokin-portal.jp/subsidies/list",
        "page_title": "補助金・助成金・給付金一覧|使いたい補助金・助成金・給付金があるなら補助金ポータル",
        "page_excerpt": "補助金ポータルは、補助金や助成金、給付金を分かりやすくまとめた総合情報サイトです。各種補助金や助成金、給付金の申請方法、条件についての情報や関連ニュースなどをお届けしていきます。補助金・助成金・給付金についてさらに詳しく知りたい方は、無料相談窓口もあるので、お気軽にお問合わせください。 補助金ポータルは、補助金や助成金、給付金を分かりやすくまとめた総合情報サ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18927,
      "code": "pref_boryokudan_exclusion",
      "name_ja": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "name_en": "Prefectural boryokudan-related business suspension and tender-exclusion lists",
      "category": "antisocial",
      "is_active": true,
      "base_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "地方自治体公开的暴力团关联经营者指名停止或入札排除公告，提供具体行政措施资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:59.545072+00:00",
        "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
        "final_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
        "page_title": "暴力団関係事業者に対する指名停止措置等一覧表 - 福岡県庁ホームページ",
        "page_excerpt": " ",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18976,
      "code": "data_go_jp_catalog",
      "name_ja": "data.go.jp データカタログ横断検索",
      "name_en": "data.go.jp CKAN open data catalog discovery",
      "category": "open_data",
      "is_active": true,
      "base_url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "e-Gov 数据目录的 CKAN 搜索接口，返回数据集说明、资源 URL 和部门等目录元数据；不等于已采集资源正文。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:21:59.749024+00:00",
        "url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
        "final_url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
        "page_title": "",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18980,
      "code": "jipdec_pmark",
      "name_ja": "JIPDEC プライバシーマーク付与事業者検索",
      "name_en": "JIPDEC PrivacyMark certified organizations",
      "category": "certification",
      "is_active": true,
      "base_url": "https://entity-search.jipdec.or.jp/pmark/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "JIPDEC PrivacyMark 获授予事业者检索，提供标志登记企业及相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:00.022396+00:00",
        "url": "https://entity-search.jipdec.or.jp/pmark/",
        "final_url": "https://entity-search.jipdec.or.jp/pmark/",
        "page_title": "プライバシーマーク付与事業者検索",
        "page_excerpt": "JIPDECからプライバシーマークの付与を受けたプライバシーマーク付与事業者の情報を検索できます。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18981,
      "code": "isms_ac_certified_orgs",
      "name_ja": "ISMS-AC ISMS認証取得組織検索",
      "name_en": "ISMS-AC certified organization search",
      "category": "certification",
      "is_active": true,
      "base_url": "https://isms.jp/lst/ind/index.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "ISMS 认可机构公开的认证组织检索，提供组织、认证及相关范围资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:19.864470+00:00",
        "url": "https://isms.jp/lst/ind/index.html",
        "final_url": "https://isms.jp/lst/ind/index.html",
        "page_title": "ISMS認証取得組織検索",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18982,
      "code": "shizuoka_boryokudan_public_notice",
      "name_ja": "静岡県公安委員会 暴力団排除条例 公表結果",
      "name_en": "Shizuoka Public Safety Commission boryokudan-exclusion ordinance public notices",
      "category": "antisocial",
      "is_active": true,
      "base_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "静冈县公安委员会依据暴力团排除条例公布的公示结果，属于特定行政公示资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:00.371914+00:00",
        "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
        "final_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
        "page_title": "静岡県暴力団排除条例｜静岡県警察",
        "page_excerpt": "静岡県警察",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18986,
      "code": "hirakata_sanpai_waste_licensees",
      "name_ja": "枚方市 産業廃棄物処理業者名簿",
      "name_en": "Hirakata City Industrial Waste Licensee Lists",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "枚方市公开的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:00.409144+00:00",
        "url": "https://www.city.hirakata.osaka.jp/0000004004.html",
        "final_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
        "page_title": "産業廃棄物処理業者名簿 | 枚方市ホームページ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18991,
      "code": "mhlw_positive_ryouritsu",
      "name_ja": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "name_en": "MHLW Positive Action / Work-Life Balance open data",
      "category": "workforce",
      "is_active": true,
      "base_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "厚生劳动省女性活跃推进企业数据库开放数据，提供企业劳动、女性就业及相关认定或表彰信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:00.854981+00:00",
        "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
        "final_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
        "page_title": "女性の活躍推進企業データベース | オープンデータ（企業公表データのダウンロード）",
        "page_excerpt": "当ホームページは、企業における女性の活躍状況に関する情報を集約したデータベースです ～働く場所は、わたしが見つける～　女性活躍推進法に基づき、全国の企業が女性の活躍状況に関する情報・行動計画を公表しています。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18992,
      "code": "miyagi_sanpai_excellent_waste_licensees",
      "name_ja": "宮城県 優良産業廃棄物処理業者名簿",
      "name_en": "Miyagi Excellent Industrial Waste Licensee List",
      "category": "license_registry",
      "is_active": true,
      "base_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "宮城県公开的获优良认定的产业废弃物处理业者名录，提供企业、许可及相关公开资料；具体字段依当地文件而异。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:01.558574+00:00",
        "url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
        "final_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
        "page_title": "産業廃棄物処理業者名簿 - 宮城県公式ウェブサイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18994,
      "code": "address_base_registry_aza",
      "name_ja": "アドレス・ベース・レジストリ 町字マスター",
      "name_en": "Address Base Registry Machi-Aza Master",
      "category": "official_registry",
      "is_active": true,
      "base_url": "https://www.digital.go.jp/policies/base_registry_address",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "数字厅地址基础登记的町字主数据，提供行政区划与町字地址标识，用于地址标准化和匹配。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:01.657694+00:00",
        "url": "https://www.digital.go.jp/policies/base_registry_address",
        "final_url": "https://www.digital.go.jp/policies/base_registry_address",
        "page_title": "アドレス・ベース・レジストリ｜デジタル庁",
        "page_excerpt": "デジタル庁は、デジタル社会形成の司令塔として、未来志向のDX（デジタル・トランスフォーメーション）を大胆に推進し、デジタル時代の官民のインフラを一気呵成に作り上げることを目指します。 デジタル庁は、デジタル社会形成の司令塔として、未来志向のDX（デジタル・トランスフォーメーション）を大胆に推進し、デジタル時代の官民のインフラを一気呵成に作り上げることを目指し",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 18998,
      "code": "court_case_intelligence",
      "name_ja": "裁判所判例 司法・訴訟インテリジェンス",
      "name_en": "Courts.go.jp Court Case Intelligence",
      "category": "derived",
      "is_active": true,
      "base_url": "https://www.courts.go.jp/app/hanrei_jp/search1",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "从公开判例及文书解析得到的司法诉讼情报逻辑来源，涉及案件、当事人和裁判要素，属于后续加工。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:19.877605+00:00",
        "url": "https://www.courts.go.jp/app/hanrei_jp/search1",
        "final_url": "https://www.courts.go.jp/error_document/sorry.html",
        "page_title": "メンテナンス中 / Maintenance",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19000,
      "code": "ipa_security_action",
      "name_ja": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "name_en": "IPA SECURITY ACTION self-declared organizations",
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "IPA SECURITY ACTION 信息安全措施自我宣言经营者名单，属于自我声明，不等同于第三方认证。 当前登记链接页面注明为 2026 年 3 月以前申请的宣言者名单，不能据此声称覆盖之后的新申请。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:01.788973+00:00",
        "url": "https://www.ipa.go.jp/security/security-action/activity/",
        "final_url": "https://www.ipa.go.jp/security/security-action/activity/",
        "page_title": "2026年3月以前に申込された宣言事業者一覧 : SECURITY ACTION セキュリティ対策自己宣言",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19001,
      "code": "meti_bcp_keizokuryoku",
      "name_ja": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "name_en": "SME Agency Business Continuity Reinforcement Plan certified operators",
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "中小企业厅事业持续力强化计划认定经营者名单，提供认定企业和相关资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:02.409511+00:00",
        "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
        "final_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
        "page_title": "「事業継続力強化計画」認定事業者一覧 | 中小企業庁",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19005,
      "code": "smart_sme_supporter",
      "name_ja": "スマートSMEサポーター 認定情報処理支援機関検索",
      "name_en": "Smart SME Supporter certified information processing support agencies",
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "Smart SME Supporter 认定信息处理支援机构检索，提供获认定 IT 支援机构资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:02.606678+00:00",
        "url": "https://www.smartsme.go.jp/SSS_SearchPage",
        "final_url": "https://www.smartsme.go.jp/SSS_SearchPage",
        "page_title": "情報処理支援機関検索 | スマートSME",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19006,
      "code": "government_procurement_suspensions",
      "name_ja": "政府・自治体 指名停止・入札参加停止情報",
      "name_en": "Government procurement suspensions and debarment notices",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "中央部门和地方自治体公开的指名停止及采购参与停止公告集合，包含对象、期间和事由。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:02.823765+00:00",
        "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
        "final_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
        "page_title": "競争参加資格停止・指名停止情報｜デジタル庁",
        "page_excerpt": "デジタル庁は、デジタル社会形成の司令塔として、未来志向のDX（デジタル・トランスフォーメーション）を大胆に推進し、デジタル時代の官民のインフラを一気呵成に作り上げることを目指します。 デジタル庁は、デジタル社会形成の司令塔として、未来志向のDX（デジタル・トランスフォーメーション）を大胆に推進し、デジタル時代の官民のインフラを一気呵成に作り上げることを目指し",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19009,
      "code": "nintei_shien_kikan",
      "name_ja": "認定経営革新等支援機関検索",
      "name_en": "Certified management innovation support institutions search",
      "category": "certification",
      "is_active": true,
      "base_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "认定经营革新等支援机构检索，提供获认定支援机构的基本信息和服务线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:27:19.984089+00:00",
        "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
        "final_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
        "page_title": "認定支援機関検索_エリア選択",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19017,
      "code": "jetro_case_studies",
      "name_ja": "ジェトロ活用事例",
      "name_en": "JETRO case studies",
      "category": "business_expansion",
      "is_active": true,
      "base_url": "https://www.jetro.go.jp/case_study/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "JETRO 公开的企业利用事例，介绍企业国际业务、支援措施和案例背景。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:03.594956+00:00",
        "url": "https://www.jetro.go.jp/case_study/",
        "final_url": "https://www.jetro.go.jp/case_study/",
        "page_title": "ジェトロ活用事例 | ジェトロ",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19018,
      "code": "kaken",
      "name_ja": "KAKEN 科学研究費助成事業データベース",
      "name_en": "KAKEN database of Grants-in-Aid for Scientific Research",
      "category": "research_collaboration",
      "is_active": true,
      "base_url": "https://kaken.nii.ac.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "日本科研费项目数据库，提供研究课题、研究者、机构及研究成果等信息。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:03.605238+00:00",
        "url": "https://kaken.nii.ac.jp/",
        "final_url": "https://kaken.nii.ac.jp/",
        "page_title": "KAKEN — Research Projects",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19028,
      "code": "jftc_subcontract_recommendations",
      "name_ja": "公正取引委員会 下請法勧告一覧",
      "name_en": "JFTC Subcontract Act recommendation list",
      "category": "admin_action",
      "is_active": true,
      "base_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "公平交易委员会公开的下请法建议案件名录，提供经营者、违法事项和建议内容。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:04.034654+00:00",
        "url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
        "final_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
        "page_title": "データセット\n | e-Govデータポータル",
        "page_excerpt": "データカタログに登録済みのデータセットの詳細、リソースの一覧を表示します。 公正取引委員会による下請法勧告一覧",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19029,
      "code": "fsa_license_lists",
      "name_ja": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "name_en": "FSA licensed and registered business lists from Excel workbooks",
      "category": "license",
      "is_active": true,
      "base_url": "https://data.e-gov.go.jp/data/group/fsa",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "金融厅各类获免许、许可或登记经营者的 Excel 名单集合，涵盖多个金融行业类别。",
        "basis": "本次网站请求未完成；简介依据来源登记和已有代码／核查记录，未声称已核验网站正文。",
        "website_review": "unavailable",
        "checked_at": "2026-11-02T11:22:04.258095+00:00",
        "url": "https://data.e-gov.go.jp/data/group/fsa",
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "request_failed",
        "request_note": "HTTP Error 404: Not Found",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19204,
      "code": "jpo_ip_api",
      "name_ja": "特許庁 知財情報API / J-PlatPat",
      "name_en": "JPO IP APIs / J-PlatPat Public Lookup",
      "category": "ip",
      "is_active": true,
      "base_url": "https://ip-data.jpo.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "特许厅知识产权信息 API / J-PlatPat 相关接口，提供专利商标等文献和法律状态资料，接口使用条件另行适用。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:04.388387+00:00",
        "url": "https://ip-data.jpo.go.jp/",
        "final_url": "https://ip-data.jpo.go.jp/pages/top.html",
        "page_title": "API情報提供サイト",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 19694,
      "code": "company_public_legal_pages",
      "name_ja": "公式サイト公開開示ページ",
      "name_en": "Company official public legal pages",
      "category": "company",
      "is_active": true,
      "base_url": null,
      "url_note": "登记表未提供可用 HTTP(S) URL；可能为派生来源或动态入口",
      "description": {
        "summary": "逐家企业官网公开披露或法定页面的逻辑来源集合，范围取决于企业实际公开内容，未登记统一网站入口。",
        "basis": "无统一登记 URL；这是逻辑来源或网站集合，简介依据登记和已有代码。",
        "website_review": "logical_source",
        "checked_at": "2026-11-02T11:22:05.431703+00:00",
        "url": null,
        "final_url": null,
        "page_title": "",
        "page_excerpt": "",
        "http_status": "no_registered_url",
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 20250,
      "code": "moj_e_koukoku",
      "name_ja": "法務省電子公告システム",
      "name_en": "Ministry of Justice Electronic Public Notice System",
      "category": "legal_notice",
      "is_active": true,
      "base_url": "https://e-koukoku.moj.go.jp/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "法务省电子公告系统，提供当前公开期间内的电子公告相关企业及公告线索。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:05.431725+00:00",
        "url": "https://e-koukoku.moj.go.jp/",
        "final_url": "https://e-koukoku.moj.go.jp/",
        "page_title": "法務省電子公告システム",
        "page_excerpt": "",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    },
    {
      "id": 25491,
      "code": "enecho_power_generators",
      "name_ja": "資源エネルギー庁 発電事業者一覧",
      "name_en": "ANRE Electricity Generators",
      "category": "license",
      "is_active": true,
      "base_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "url_note": "data_sources.base_url；具体抓取入口见 crawler URL 证据",
      "description": {
        "summary": "资源能源厅发电事业者公开名单，包含经营者、所在地和申报日期等资料。",
        "basis": "本次读到公开页面；简介结合页面、来源登记及已有代码归纳，不表示所有字段或目录资源已逐项核验。",
        "website_review": "public_page_response",
        "checked_at": "2026-11-02T11:22:05.435254+00:00",
        "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
        "final_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
        "page_title": "発電事業者一覧｜資源エネルギー庁",
        "page_excerpt": "経済産業省・資源エネルギー庁のホームページです。電力・ガスの政策、電力需給対策、発電事業に係る届出義務について 発電事業者一覧。",
        "http_status": 200,
        "request_note": "",
        "site_scope_note": "",
        "evidence_file": "evidence/source_content_snapshot.json"
      }
    }
  ],
  "relationships": [
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "address_base_aza",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "address_base_aza",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 263,
          "origin": "online",
          "kind": "sql_write",
          "sql": "COPY address_base_aza ("
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "aichi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_aichi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 380,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'aichi_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'first_permit_date', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHIN"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛知県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aichi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_aichi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 360,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'aichi_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛知県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aomori_alis_supporter",
      "crawler": "backend/scripts/import_aomori_alis_supporter_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 405,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県総合社会教育センター 学校教育サポーター",
      "source_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
      "crawler_url_candidates": [
        {
          "url": "https://www.alis.pref.aomori.lg.jp/supporter/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aomori_alis_supporter",
      "crawler": "backend/scripts/import_aomori_alis_supporter_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 385,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.62, 'active', 'show_public',\n                jsonb_build_object(\n                  'aomori_alis_corp', %s::text,\n                  'source', 'aomori_alis_supporter_public_directory'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県総合社会教育センター 学校教育サポーター",
      "source_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
      "crawler_url_candidates": [
        {
          "url": "https://www.alis.pref.aomori.lg.jp/supporter/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aomori_sanpai_association_members",
      "crawler": "backend/scripts/import_aomori_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 276,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県産業資源循環協会 協会員名簿",
      "source_url": "http://www.aosanpaikyou.or.jp/member-list",
      "crawler_url_candidates": [
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "source_url",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 301,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aomori_sanpai_association_members",
      "crawler": "backend/scripts/import_aomori_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 256,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.68, 'active', 'show_public',\n                jsonb_build_object(\n                  'aomori_sanpai_association_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source', 'aomori_sanpai_association_member_list'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県産業資源循環協会 協会員名簿",
      "source_url": "http://www.aosanpaikyou.or.jp/member-list",
      "crawler_url_candidates": [
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "source_url",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 301,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 380,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO professionals (\n                                profession_type, registration_no,\n                                display_name, search_name, name_kana,\n                                bar_association,\n                                office_name, office_corporate_number,\n                                office_address,\n                                registered_at, status,\n                                source_id, source_url, fetched_at, meta\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, NULL, %s, %s, %s,\n                                %s, %s, %s, %s::jsonb\n                            )\n                            ON CONFLICT (profession_type, registration_no)\n                            DO UPDATE SET\n                                display_name = EXCLUDED.display_name,\n                                search_name = EXCLUDED.search_name,\n                                name_kana = EXCLUDED.name"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "benrishi_navi",
          "enabled": true,
          "line": 349
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 177,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO professionals (\n    profession_type, registration_no, display_name, search_name, name_kana,\n    bar_association, office_name, office_address, status,\n    source_id, source_url, fetched_at, meta\n) VALUES (\n    %(profession_type)s, %(registration_no)s, %(display_name)s, %(search_name)s, %(name_kana)s,\n    %(bar_association)s, %(office_name)s, %(office_address)s, 'active',\n    %(source_id)s, %(source_url)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (profession_type, registration_no) DO UPDATE SET\n    display_name   = EXCLUDED.display_name,\n    search_name    = EXCLUDED.search_name,\n    name_kana      = EXCLUDED.name_kana,\n    bar_association = EXCLUDED.bar_association,\n    office_name    = EXCLUDED.office_name,\n    office_address = EXCLUDED.office_address,\n    source_url     = EXCLUDED.source_url,\n    fetched_at     = EXCLUDED.fetched_at,\n    meta           = EXCLUDED.meta\nRETURNING id, (xmax = 0) AS inserted\n"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "弁理士ナビ",
      "source_url": "https://www.benrishi-navi.com/",
      "crawler_url_candidates": [
        {
          "url": "https://www.benrishi-navi.com",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "ENDPOINT",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 228,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "benrishi_navi",
          "line": 349,
          "module_chain": [
            "backend.crawlers.sources.benrishi_navi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 98,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_actions",
          "enabled": true,
          "line": 109
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 処分公表",
      "source_url": "https://www.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.caa.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_actions",
          "line": 109,
          "module_chain": [
            "backend.crawlers.sources.caa_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2277,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 特定商取引法ガイド 執行事例検索",
      "source_url": "https://www.no-trouble.caa.go.jp/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.no-trouble.caa.go.jp/search/",
          "symbol": "NO_TROUBLE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 50,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 113,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_recall",
          "enabled": true,
          "line": 115
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 リコール情報",
      "source_url": "https://www.recall.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 162,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_recall",
          "line": 115,
          "module_chain": [
            "backend.crawlers.sources.caa_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "financial_statements",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "financial_statements",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 769,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO financial_statements\n          (corporate_number, edinet_doc_id, fiscal_period_no, period_end,\n           period_type, consolidated, currency,\n           revenue, operating_profit, ordinary_profit, net_income,\n           total_assets, total_liabilities, total_equity,\n           source_id, raw_doc_id, fetched_at)\n        VALUES (%s, NULL, %s, %s,\n                'annual', false, 'JPY',\n                %s, %s, %s, %s,\n                %s, NULL, NULL,\n                %s, %s, now())\n        ON CONFLICT (corporate_number, period_end, period_type, consolidated)\n        DO NOTHING\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_financial_facts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_financial_facts",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 1226,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_financial_facts (\n            notice_id, source_record_id, corporate_number,\n            fiscal_period_no, period_start, period_end, period_type,\n            consolidated, currency, revenue, operating_profit,\n            ordinary_profit, net_income, total_assets,\n            retained_earnings, source_amount_texts, source_specific,\n            quality_score, best_for_derivation\n        ) VALUES (\n            %s, %s, %s,\n            %s, %s, %s, 'annual',\n            FALSE, 'JPY', %s, %s,\n            %s, %s, %s,\n            %s, %s::jsonb, %s::jsonb,\n            %s, %s\n        )\n        ON CONFLICT (notice_id, source_record_id)\n        DO UPDATE SET\n            corporate_number = COALESCE(EXCLUDED.corporate_number, kanpo_financial_facts.corporate_number),\n            fiscal_period_no = EXCLUDED.fiscal_period_no,\n            period_start = EXCLUDED.period_start,\n            period_end = EXCLUDED.period_end,\n            revenue = EXCLUDED.revenue,\n            opera"
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_notice_entities",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_notice_entities",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 1181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_notice_entities (\n            notice_id, source_record_id, role, name_raw, address_raw,\n            representative_raw, corporate_number, match_confidence,\n            extraction_method, payload\n        ) VALUES (\n            %s, %s, 'subject_company', %s, %s,\n            %s, %s, %s,\n            %s, %s::jsonb\n        )\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_notices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_notices",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 1041,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_notices (\n            canonical_key, notice_type, notice_subtype, published_on,\n            title, company_name_raw, address_raw, corporate_number,\n            match_confidence, extraction_method, fiscal_period_no,\n            period_start, period_end, notice_payload, review_status,\n            updated_at\n        ) VALUES (\n            %s, 'financial_statement', 'catr_settlement', %s,\n            %s, %s, %s, %s,\n            %s, 'catr_html', %s,\n            %s, %s, %s::jsonb, %s,\n            now()\n        )\n        ON CONFLICT (canonical_key)\n        DO UPDATE SET\n            published_on = EXCLUDED.published_on,\n            title = EXCLUDED.title,\n            company_name_raw = EXCLUDED.company_name_raw,\n            address_raw = EXCLUDED.address_raw,\n            corporate_number = COALESCE(EXCLUDED.corporate_number, kanpo_notices.corporate_number),\n            match_confidence = COALESCE(EXCLUDED.match_confidence, kanpo_notices.match_confidence),\n           "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_source_records",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_source_records",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 1100,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_source_records (\n            notice_id, source_id, source_record_type, source_record_id,\n            source_url, source_url_hash, raw_doc_id, raw_doc_fetched_at,\n            source_published_on, source_title, source_company_name,\n            source_payload, extracted_payload, parser_version, confidence,\n            fetched_at\n        ) VALUES (\n            %s, %s, 'catr_settlement', %s,\n            %s, %s, %s, %s,\n            %s, %s, %s,\n            %s::jsonb, %s::jsonb, %s, %s,\n            now()\n        )\n        ON CONFLICT (source_id, source_url_hash)\n        DO UPDATE SET\n            notice_id = EXCLUDED.notice_id,\n            raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, kanpo_source_records.raw_doc_id),\n            raw_doc_fetched_at = COALESCE(EXCLUDED.raw_doc_fetched_at, kanpo_source_records.raw_doc_fetched_at),\n            source_published_on = EXCLUDED.source_published_on,\n            source_title = EXCLUDED.source_title,\n            source_company_nam"
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "chiba_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_chiba_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 304,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'chiba_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page', %s::int,\n             'row_on_page', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "千葉県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "chiba_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_chiba_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 277,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'chiba_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "千葉県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/geocode_companies.py",
          "line": 223,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE companies\n               SET geo_lat = %s,\n                   geo_lng = %s,\n                   last_updated_at = now()\n             WHERE corporate_number = %s\n               AND (geo_lat IS NULL OR geo_lng IS NULL)\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [
        {
          "url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
          "symbol": "GSI_URL",
          "file": "backend/scripts/geocode_companies.py",
          "line": 25,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel",
            "backend.scripts.geocode_companies"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.geocode_companies_parallel",
            "backend.scripts.geocode_companies"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "company_geocodes",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_geocodes",
          "file": "backend/scripts/geocode_companies.py",
          "line": 196,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_geocodes (\n                corporate_number, address_hash, query_address, matched_address,\n                lat, lng, precision, source, confidence, provider_payload,\n                geocoded_at, updated_at\n            ) VALUES (\n                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb, now(), now()\n            )\n            ON CONFLICT (corporate_number) DO UPDATE SET\n                address_hash = EXCLUDED.address_hash,\n                query_address = EXCLUDED.query_address,\n                matched_address = EXCLUDED.matched_address,\n                lat = EXCLUDED.lat,\n                lng = EXCLUDED.lng,\n                precision = EXCLUDED.precision,\n                source = EXCLUDED.source,\n                confidence = EXCLUDED.confidence,\n                provider_payload = EXCLUDED.provider_payload,\n                updated_at = now()\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [
        {
          "url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
          "symbol": "GSI_URL",
          "file": "backend/scripts/geocode_companies.py",
          "line": 25,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel",
            "backend.scripts.geocode_companies"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.geocode_companies_parallel",
            "backend.scripts.geocode_companies"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 281,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE companies\n               SET geo_lat = %s,\n                   geo_lng = %s,\n                   last_updated_at = now()\n             WHERE corporate_number = %s\n               AND (geo_lat IS NULL OR geo_lng IS NULL)\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "company_geocodes",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_geocodes",
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 247,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_geocodes (\n                corporate_number, address_hash, query_address, matched_address,\n                lat, lng, precision, source, confidence, provider_payload,\n                geocoded_at, updated_at\n            ) VALUES (\n                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb, now(), now()\n            )\n            ON CONFLICT (corporate_number) DO UPDATE SET\n                address_hash = EXCLUDED.address_hash,\n                query_address = EXCLUDED.query_address,\n                matched_address = EXCLUDED.matched_address,\n                lat = EXCLUDED.lat,\n                lng = EXCLUDED.lng,\n                precision = EXCLUDED.precision,\n                source = EXCLUDED.source,\n                confidence = EXCLUDED.confidence,\n                provider_payload = EXCLUDED.provider_payload,\n                updated_at = now()\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_location_profile",
      "crawler": "backend/scripts/derive_company_location_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_location_profile",
          "enabled": true,
          "line": 305
        }
      ],
      "table": "company_geo_density_grid",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_geo_density_grid",
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 107,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                    INSERT INTO company_geo_density_grid (\n                        scale_m, lat_bin, lng_bin,\n                        company_count, risk_count, listed_count, computed_at\n                    )\n                    SELECT\n                        %s AS scale_m,\n                        floor(c.geo_lat::float8 / %s)::int AS lat_bin,\n                        floor(c.geo_lng::float8 / %s)::int AS lng_bin,\n                        count(*)::int AS company_count,\n                        count(*) FILTER (WHERE c.has_risk_events)::int AS risk_count,\n                        count(*) FILTER (WHERE c.is_listed)::int AS listed_count,\n                        now()\n                      FROM companies c\n                     WHERE c.geo_lat IS NOT NULL\n                       AND c.geo_lng IS NOT NULL\n                     GROUP BY 1, 2, 3\n                    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地・不動産環境プロファイル",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_location_profile",
          "line": 305,
          "module_chain": [
            "backend.scripts.derive_company_location_profiles"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "derived",
      "schedule_plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_location_profile",
      "crawler": "backend/scripts/derive_company_location_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_location_profile",
          "enabled": true,
          "line": 305
        }
      ],
      "table": "company_location_profiles",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_location_profiles",
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 349,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                    INSERT INTO company_location_profiles (\n                        corporate_number, geo_lat, geo_lng, geocode_confidence,\n                        nearest_land_price_id, nearest_land_price_year,\n                        nearest_land_price_jpy_per_sqm, nearest_land_price_yoy_pct,\n                        nearest_land_price_distance_m, nearest_land_price_use_category,\n                        nearest_land_price_station,\n                        land_price_points_1km, land_price_avg_1km, land_price_max_1km,\n                        land_price_yoy_avg_1km,\n                        tx_city_code, tx_count_3y, tx_median_price_jpy,\n                        tx_avg_price_per_sqm, tx_latest_year,\n                        nearby_companies_200m, nearby_companies_1km, nearby_companies_3km,\n                        nearby_risk_companies_1km, nearby_listed_companies_1km,\n                        same_address_count, location_signal_score, signals,\n                        computed_at, source_ver"
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地・不動産環境プロファイル",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_location_profile",
          "line": 305,
          "module_chain": [
            "backend.scripts.derive_company_location_profiles"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "derived",
      "schedule_plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/run_phase4_v3_subpages.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "phase4_subpages",
          "enabled": true,
          "line": 271
        }
      ],
      "table": "company_subpage_data",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_subpage_data",
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 514,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_subpage_data (\n    corporate_number, subpage_type, subpage_url, fetched_at,\n    http_status, title, content_excerpt, extracted_data, content_hash\n) VALUES (\n    %(corporate_number)s, %(subpage_type)s, %(subpage_url)s, %(fetched_at)s,\n    %(http_status)s, %(title)s, %(content_excerpt)s, %(extracted_data)s::jsonb, %(content_hash)s\n)\nON CONFLICT (corporate_number, subpage_type) DO UPDATE SET\n    subpage_url = EXCLUDED.subpage_url,\n    fetched_at = EXCLUDED.fetched_at,\n    http_status = EXCLUDED.http_status,\n    title = EXCLUDED.title,\n    content_excerpt = EXCLUDED.content_excerpt,\n    extracted_data = EXCLUDED.extracted_data,\n    content_hash = EXCLUDED.content_hash\n"
        }
      ],
      "dimensions": [
        2,
        7,
        8,
        9,
        11
      ],
      "source_name": "公式サイト会社概要",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {
        "2": "subpage_type='products'",
        "7": "subpage_type='history'",
        "8": "subpage_type='news'",
        "9": "subpage_type='hiring'",
        "11": "subpage_type='ir'"
      },
      "enabled_schedule_paths": [
        {
          "task": "phase4_subpages",
          "line": 271,
          "module_chain": [
            "backend.scripts.run_phase4_v3_subpages"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "phase4_subpages",
          "scheduler": "schedule.yaml",
          "cron": "30 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:30",
          "command": "python3 -m backend.scripts.run_phase4_v3_subpages --daily-shard",
          "modules": [
            "backend.scripts.run_phase4_v3_subpages"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:30:00+09:00",
              "beijing": "2026-11-04T01:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:30:00+09:00",
              "beijing": "2026-11-05T01:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:30:00+09:00",
              "beijing": "2026-11-06T01:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 271,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/run_phase4_website_scraper.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "phase4_homepage",
          "enabled": true,
          "line": 265
        }
      ],
      "table": "company_website_data",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_website_data",
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 592,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_website_data (\n    corporate_number, source_url, fetched_at, http_status, final_url,\n    og_title, og_description, og_site_name, og_image, page_title,\n    phone, fax, contact_email, address_extracted, founded_date_raw,\n    capital_raw, employees_raw, business_description, representative_name,\n    content_hash, parse_method, parse_quality, charset_detected,\n    meta, errors, updated_at\n) VALUES (\n    %(corporate_number)s, %(source_url)s, %(fetched_at)s, %(http_status)s, %(final_url)s,\n    %(og_title)s, %(og_description)s, %(og_site_name)s, %(og_image)s, %(page_title)s,\n    %(phone)s, %(fax)s, %(contact_email)s, %(address_extracted)s, %(founded_date_raw)s,\n    %(capital_raw)s, %(employees_raw)s, %(business_description)s, %(representative_name)s,\n    %(content_hash)s, %(parse_method)s, %(parse_quality)s, %(charset_detected)s,\n    %(meta)s::jsonb, %(errors)s::jsonb, now()\n)\nON CONFLICT (corporate_number) DO UPDATE SET\n    source_url = EXCLUDED.source_url,\n    fetched_a"
        }
      ],
      "dimensions": [
        1,
        2,
        3,
        5,
        6,
        7,
        11
      ],
      "source_name": "公式サイト会社概要",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {
        "1": "page_title / og_site_name",
        "2": "business_description",
        "3": "phone / fax / contact_email / address_extracted",
        "5": "representative_name",
        "6": "employees_raw",
        "7": "founded_date_raw",
        "11": "capital_raw / employees_raw"
      },
      "enabled_schedule_paths": [
        {
          "task": "phase4_homepage",
          "line": 265,
          "module_chain": [
            "backend.scripts.run_phase4_website_scraper"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "phase4_homepage",
          "scheduler": "schedule.yaml",
          "cron": "0 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:00",
          "command": "python3 -m backend.scripts.run_phase4_website_scraper",
          "modules": [
            "backend.scripts.run_phase4_website_scraper"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:00:00+09:00",
              "beijing": "2026-11-04T01:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:00:00+09:00",
              "beijing": "2026-11-05T01:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:00:00+09:00",
              "beijing": "2026-11-06T01:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 265,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "construction_licenses",
          "enabled": true,
          "line": 587
        }
      ],
      "table": "construction_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "construction_licenses",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 497,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO construction_licenses (\n    corporate_number, kyoka_no, kyoka_type,\n    issuing_prefecture, issuing_authority,\n    name, name_kana, representative,\n    address, zip_code, phone,\n    gyoshu, gyoshu_ippan, gyoshu_tokutei,\n    capital_jpy, corporation_type,\n    granted_at, expires_at, status,\n    source_id, raw_doc_id, fetched_at, meta\n) VALUES (\n    %(corporate_number)s, %(kyoka_no)s, %(kyoka_type)s,\n    %(issuing_prefecture)s, %(issuing_authority)s,\n    %(name)s, %(name_kana)s, %(representative)s,\n    %(address)s, %(zip_code)s, %(phone)s,\n    %(gyoshu)s, %(gyoshu_ippan)s, %(gyoshu_tokutei)s,\n    %(capital_jpy)s, %(corporation_type)s,\n    %(granted_at)s, %(expires_at)s, 'active',\n    %(source_id)s, %(raw_doc_id)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (kyoka_no, issuing_prefecture) DO UPDATE SET\n    corporate_number = COALESCE(EXCLUDED.corporate_number, construction_licenses.corporate_number),\n    kyoka_type       = EXCLUDED.kyoka_type,\n    issuing_authority= EXCLUDE"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "建設業者 全国 (国交省 + 47都道府県)",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/ksGaiyo.do",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "construction_licenses",
          "line": 587,
          "module_chain": [
            "backend.crawlers.sources.construction_licenses"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "court_case_intelligence",
      "crawler": "backend/scripts/run_court_case_intelligence_job.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 18,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "court_case_intelligence",
          "enabled": true,
          "line": 85
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 68,
          "origin": "online",
          "kind": "sql_write",
          "sql": "Also update risk_events/court_hanrei_pdf_parses JSON fields."
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例 司法・訴訟インテリジェンス",
      "source_url": "https://www.courts.go.jp/app/hanrei_jp/search1",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/crawlers/sources/courts_hanrei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei",
          "enabled": true,
          "line": 73
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 263,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n    INSERT INTO risk_events (\n      corporate_number, match_confidence, extraction_method,\n      category, subcategory, severity,\n      title, body, body_extracted, authority,\n      event_date, effective_from, effective_to,\n      pdf_attachments, pdf_processing_status,\n      source_id, source_url, raw_doc_id, fetched_at, parser_version,\n      is_published_by_authority, display_policy, narrative_form\n    ) VALUES (\n      NULL, NULL, 'meta_only_pdf_pending',\n      'litigation', %(subcategory)s, %(severity)s,\n      %(title)s, NULL, %(body_extracted)s::jsonb, '裁判所',\n      %(event_date)s, NULL, NULL,\n      %(pdf_attachments)s, 'pending',\n      %(source_id)s, %(source_url)s, NULL, %(fetched_at)s, %(parser_version)s,\n      TRUE, 'show', 'factual'\n    ) RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "src_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 285,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 192,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei",
          "line": 73,
          "module_chain": [
            "backend.crawlers.sources.courts_hanrei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "courts_hanrei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:00",
          "command": "python3 -m backend.crawlers.sources.courts_hanrei --pages-max 50",
          "modules": [
            "backend.crawlers.sources.courts_hanrei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:00:00+09:00",
              "beijing": "2026-11-05T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:00:00+09:00",
              "beijing": "2026-11-06T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 73,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "court_case_company_links",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "court_case_company_links",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 1026,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO court_case_company_links (\n                  risk_event_id, event_date, corporate_number, hanrei_id,\n                  source_id, source_url, court_name, judge_date, company_names,\n                  party_roles, match_confidence, match_method, is_best,\n                  parser_version, parsed_at\n                ) VALUES (\n                  %s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb, %s, %s, %s, %s, %s, now()\n                )\n                ON CONFLICT (risk_event_id, event_date, corporate_number)\n                DO UPDATE SET\n                  hanrei_id=EXCLUDED.hanrei_id,\n                  source_id=EXCLUDED.source_id,\n                  source_url=EXCLUDED.source_url,\n                  court_name=EXCLUDED.court_name,\n                  judge_date=EXCLUDED.judge_date,\n                  company_names=EXCLUDED.company_names,\n                  party_roles=EXCLUDED.party_roles,\n                  match_confidence=EXCLUDED.match_confidence,\n                  matc"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "court_case_facts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "court_case_facts",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 902,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO court_case_facts (\n              risk_event_id, event_date, source_id, hanrei_id, source_url,\n              pdf_url, case_title, case_no, court_name, judge_date, case_tags,\n              disposition, claims, issues, legal_references, monetary_amounts,\n              ip_rights, case_numbers_mentioned, page_count, text_chars,\n              text_hash, extracted_fields, parser_version, parsed_at\n            ) VALUES (\n              %(risk_event_id)s, %(event_date)s, %(source_id)s, %(hanrei_id)s,\n              %(source_url)s, %(pdf_url)s, %(case_title)s, %(case_no)s,\n              %(court_name)s, %(judge_date)s, %(case_tags)s,\n              %(disposition)s::jsonb, %(claims)s::jsonb, %(issues)s::jsonb,\n              %(legal_references)s, %(monetary_amounts)s, %(ip_rights)s,\n              %(case_numbers_mentioned)s, %(page_count)s, %(text_chars)s,\n              %(text_hash)s, %(extracted_fields)s::jsonb, %(parser_version)s,\n              now()\n            )\n           "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "court_case_judges",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "court_case_judges",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 979,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO court_case_judges (\n                  risk_event_id, event_date, hanrei_id, source_id, source_url,\n                  court_name, judge_date, judge_name, role, position_text,\n                  source_text, confidence, parser_version, parsed_at\n                ) VALUES (\n                  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now()\n                )\n                ON CONFLICT (risk_event_id, event_date, judge_name, role)\n                DO UPDATE SET\n                  hanrei_id=EXCLUDED.hanrei_id,\n                  source_id=EXCLUDED.source_id,\n                  source_url=EXCLUDED.source_url,\n                  court_name=EXCLUDED.court_name,\n                  judge_date=EXCLUDED.judge_date,\n                  position_text=EXCLUDED.position_text,\n                  source_text=EXCLUDED.source_text,\n                  confidence=EXCLUDED.confidence,\n                  parser_version=EXCLUDED.parser_version,\n                  parsed_at=now()\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "court_hanrei_pdf_parses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "court_hanrei_pdf_parses",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 812,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO court_hanrei_pdf_parses (\n              risk_event_id, event_date, source_id, hanrei_id, source_url,\n              pdf_url, canonical_pdf_url, http_status, content_hash, text_hash,\n              page_count, text_chars, extracted_text, party_names,\n              company_candidates, matched_companies, extracted_fields,\n              best_corporate_number, best_confidence, match_method, status,\n              error_message, parser_version, parsed_at\n            ) VALUES (\n              %(risk_event_id)s, %(event_date)s, %(source_id)s, %(hanrei_id)s,\n              %(source_url)s, %(pdf_url)s, %(canonical_pdf_url)s, %(http_status)s,\n              %(content_hash)s, %(text_hash)s, %(page_count)s, %(text_chars)s,\n              %(extracted_text)s, %(party_names)s::jsonb,\n              %(company_candidates)s::jsonb, %(matched_companies)s::jsonb,\n              %(extracted_fields)s::jsonb, %(best_corporate_number)s,\n              %(best_confidence)s, %(match_method)s, %(sta"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 1245,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET body_extracted=%s::jsonb,\n                   pdf_attachments=%s,\n                   pdf_processing_status=%s,\n                   parser_version=%s,\n                   fetched_at=now()\n             WHERE id=%s AND event_date=%s\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 1184,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO risk_events (\n                  corporate_number, match_confidence, extraction_method,\n                  category, subcategory, severity, title, body, body_extracted,\n                  authority, event_date, effective_from, effective_to,\n                  pdf_attachments, pdf_processing_status, source_id, source_url,\n                  raw_doc_id, fetched_at, parser_version,\n                  is_published_by_authority, display_policy, narrative_form\n                )\n                SELECT\n                  %s, %s, %s,\n                  category, subcategory, severity, title, body, %s::jsonb,\n                  authority, event_date, effective_from, effective_to,\n                  %s, 'extracted', source_id, source_url,\n                  raw_doc_id, now(), %s,\n                  is_published_by_authority, display_policy, narrative_form\n                FROM risk_events\n                WHERE id=%s AND event_date=%s\n                RETURNING id\n                "
        },
        {
          "table": "risk_events",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 1152,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                    UPDATE risk_events\n                       SET corporate_number=%s,\n                           match_confidence=%s,\n                           extraction_method=%s,\n                           body_extracted=%s::jsonb,\n                           pdf_attachments=%s,\n                           pdf_processing_status='extracted',\n                           parser_version=%s,\n                           fetched_at=now()\n                     WHERE id=%s AND event_date=%s\n                    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "crypto_exchange_fsa",
          "enabled": true,
          "line": 545
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 213,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, status, source_id, fetched_at, meta\n        ) VALUES (%s, 'crypto_exchange', %s, %s, %s, 'active', %s, now(), %s::jsonb)\n        RETURNING id\n        "
        },
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE business_licenses SET meta=%s::jsonb, fetched_at=now() WHERE id=%s"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者一覧 (取扱資産含む)",
      "source_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
          "symbol": "PDF_URL",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "crypto_exchange_fsa",
          "line": 545,
          "module_chain": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 43,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 163,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, status, source_id, fetched_at, meta\n        ) VALUES (%s, %s, %s, %s, %s, 'active', %s, now(), %s::jsonb)\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 56,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "daigaku_hatsu_vc",
          "enabled": true,
          "line": 500
        }
      ],
      "table": "university_startups",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "university_startups",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 276,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO university_startups (\n                corporate_number, name, name_en, university,\n                founded_year, industry, business_stage, univ_relation,\n                ipo_status, ipo_market, prefecture, city, address,\n                rep_position, rep_name, website,\n                capital_yen, employees, revenue_yen, operating_profit_yen,\n                source_id, raw_doc_id, fetched_at, meta\n            ) VALUES (\n                %(corporate_number)s, %(name)s, %(name_en)s, %(university)s,\n                %(founded_year)s, %(industry)s, %(business_stage)s, %(univ_relation)s,\n                %(ipo_status)s, %(ipo_market)s, %(prefecture)s, %(city)s, %(address)s,\n                %(rep_position)s, %(rep_name)s, %(website)s,\n                %(capital_yen)s, %(employees)s, %(revenue_yen)s, %(operating_profit_yen)s,\n                %(source_id)s, %(raw_doc_id)s, now(), %(meta)s::jsonb\n            )\n            ON CONFLICT (source_id, name, founded_year) DO NOTHI"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "大学発ベンチャーデータベース",
      "source_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 54,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
          "symbol": "HUB_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 55,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "daigaku_hatsu_vc",
          "line": 500,
          "module_chain": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "data_go_jp_catalog",
      "crawler": "backend/crawlers/sources/data_go_jp_catalog.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "data_go_jp_catalog",
          "enabled": true,
          "line": 1086
        }
      ],
      "table": "external_data_source_discoveries",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "external_data_source_discoveries",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 223,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO external_data_source_discoveries (\n                  source_id, dataset_id, dataset_name, title, catalog_url, landing_page,\n                  organization_name, publisher, description, license_title,\n                  frequency_of_update, metadata_created, metadata_modified,\n                  keywords_matched, matched_categories, priority, resource_count,\n                  resource_formats, resource_urls, raw, fetched_at, updated_at\n                ) VALUES (\n                  %(source_id)s, %(dataset_id)s, %(dataset_name)s, %(title)s,\n                  %(catalog_url)s, %(landing_page)s, %(organization_name)s,\n                  %(publisher)s, %(description)s, %(license_title)s,\n                  %(frequency_of_update)s, %(metadata_created)s, %(metadata_modified)s,\n                  %(keywords_matched)s, %(matched_categories)s, %(priority)s,\n                  %(resource_count)s, %(resource_formats)s, %(resource_urls)s::jsonb,\n                  %(raw)s::jsonb"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "data.go.jp データカタログ横断検索",
      "source_url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
      "crawler_url_candidates": [
        {
          "url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 30,
          "origin": "online"
        },
        {
          "url": "https://data.e-gov.go.jp/data/dataset/{name}",
          "symbol": "CATALOG_DATASET_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 31,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "data_go_jp_catalog",
          "line": 1086,
          "module_chain": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "data_go_jp_catalog",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 03:40",
          "command": "python3 -m backend.crawlers.sources.data_go_jp_catalog --rows 100 --max-pages 10 --sleep 0.25",
          "modules": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:40:00+09:00",
              "beijing": "2026-11-04T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T03:40:00+09:00",
              "beijing": "2026-11-11T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T03:40:00+09:00",
              "beijing": "2026-11-18T02:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1086,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "politicians",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "politicians",
          "file": "backend/crawlers/sources/diet.py",
          "line": 138,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO politicians (\n                    display_name, search_name, name_kana,\n                    position_category, position, party, district,\n                    term_from, term_to, source_id, source_url, fetched_at\n                ) VALUES (\n                    %(display_name)s, %(search_name)s, %(name_kana)s,\n                    %(position_category)s, %(position)s, %(party)s, %(district)s,\n                    %(term_from)s, %(term_to)s, %(source_id)s, %(source_url)s, %(fetched_at)s\n                )\n                RETURNING id\n            "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "参議院議員一覧",
      "source_url": "https://www.sangiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sangiin.go.jp/japanese/joho1/kousei/giin/221/giin.htm",
          "symbol": "SANGIIN_URL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 161,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "politicians",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "politicians",
          "file": "backend/crawlers/sources/diet.py",
          "line": 138,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO politicians (\n                    display_name, search_name, name_kana,\n                    position_category, position, party, district,\n                    term_from, term_to, source_id, source_url, fetched_at\n                ) VALUES (\n                    %(display_name)s, %(search_name)s, %(name_kana)s,\n                    %(position_category)s, %(position)s, %(party)s, %(district)s,\n                    %(term_from)s, %(term_to)s, %(source_id)s, %(source_url)s, %(fetched_at)s\n                )\n                RETURNING id\n            "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "衆議院議員一覧",
      "source_url": "https://www.shugiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/syu/{n}giin.htm",
          "symbol": "SHUGIIN_URL_TPL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 528,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "米司法省 FCPA 関連処分",
      "source_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 225,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 230,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "dx_nintei",
          "enabled": true,
          "line": 533
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at, expires_at,\n               scope, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "DX認定事業者 (IPA / 経産省)",
      "source_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "crawler_url_candidates": [
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "CSV_URL",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/details",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 154,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 251,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "dx_nintei",
          "line": 533,
          "module_chain": [
            "backend.crawlers.sources.dx_nintei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 106,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "eco_action21",
          "enabled": true,
          "line": 597
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 273,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO certifications (\n    corporate_number, cert_name, authority, certified_at, expires_at,\n    scope, source_id, raw_doc_id, fetched_at, meta\n) VALUES (\n    %(corporate_number)s, %(cert_name)s, %(authority)s, %(certified_at)s, %(expires_at)s,\n    %(scope)s, %(source_id)s, %(raw_doc_id)s, now(), %(meta)s::jsonb\n)\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "source_url": "https://www.ea21.jp/register/ninsho_search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ea21.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 101,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/last_month_certification.pdf",
          "symbol": "PDF_LASTMONTH",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 102,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/recyclable_food.pdf",
          "symbol": "PDF_RECYC",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 103,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/ninsho.pdf",
          "symbol": "PDF_STATS",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 104,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "eco_action21",
          "line": 597,
          "module_chain": [
            "backend.crawlers.sources.eco_action21"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 582,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_xbrl",
          "enabled": true,
          "line": 66
        }
      ],
      "table": "financial_statements",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "financial_statements",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 164,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO financial_statements (\n    corporate_number, edinet_doc_id, period_end, period_type, consolidated,\n    currency, revenue, operating_profit, ordinary_profit, net_income,\n    total_assets, total_liabilities, total_equity, cash_and_equivalents,\n    employees, eps, bps, raw_xbrl_s3_key, source_id, raw_doc_id, fetched_at\n) VALUES (\n    %(corporate_number)s, %(edinet_doc_id)s, %(period_end)s, %(period_type)s, %(consolidated)s,\n    %(currency)s, %(revenue)s, %(operating_profit)s, %(ordinary_profit)s, %(net_income)s,\n    %(total_assets)s, %(total_liabilities)s, %(total_equity)s, %(cash_and_equivalents)s,\n    %(employees)s, %(eps)s, %(bps)s, %(raw_xbrl_s3_key)s, %(source_id)s, %(raw_doc_id)s, now()\n)\nON CONFLICT (corporate_number, period_end, period_type, consolidated) DO UPDATE SET\n    -- gbizinfo target=06 が先に入れた行は EDINET 値で上書き (より権威的)\n    edinet_doc_id        = COALESCE(EXCLUDED.edinet_doc_id, financial_statements.edinet_doc_id),\n    revenue              = COALESCE(EXCLUDED.reve"
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_business_purpose.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 258,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_business_purpose",
          "enabled": true,
          "line": 1177
        }
      ],
      "table": "company_business_purpose",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_business_purpose",
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 167,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_business_purpose (\n    corporate_number, source_kind, source_doc_id,\n    purpose_text, period_end, submit_datetime, fetched_at, meta\n) VALUES (%s, %s, %s, %s, %s, %s, now(), %s)\nON CONFLICT (corporate_number, source_kind, source_doc_id) DO UPDATE\nSET purpose_text   = EXCLUDED.purpose_text,\n    period_end     = EXCLUDED.period_end,\n    submit_datetime= EXCLUDED.submit_datetime,\n    fetched_at     = now(),\n    meta           = EXCLUDED.meta\nRETURNING (xmax = 0) AS inserted;\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 156,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_filings",
          "enabled": true,
          "line": 60
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "enabled": true,
          "line": 324
        }
      ],
      "table": "edinet_filings",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "edinet_filings",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 96,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO edinet_filings (\n          doc_id, corporate_number, edinet_code, sec_code, fund_code, filer_name,\n          ordinance_code, form_code, doc_type_code, doc_description,\n          period_start, period_end, submit_datetime, parent_doc_id,\n          current_report_reason, withdrawal_status, doc_info_edit_status,\n          disclosure_status, legal_status,\n          has_xbrl, has_pdf, has_csv, has_attach_doc, has_english_doc,\n          source_id, source_url, fetched_at, meta\n        ) VALUES (\n          %s, %s, %s, %s, %s, %s,\n          %s, %s, %s, %s,\n          %s, %s, %s, %s,\n          %s, %s, %s,\n          %s, %s,\n          %s, %s, %s, %s, %s,\n          %s, %s, now(), %s::jsonb\n        )\n        ON CONFLICT (doc_id) DO UPDATE SET\n          disclosure_status = EXCLUDED.disclosure_status,\n          withdrawal_status = EXCLUDED.withdrawal_status,\n          doc_info_edit_status = EXCLUDED.doc_info_edit_status,\n          fetched_at = now()\n        RETURNING (xmax = 0) AS i"
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2/documents.json",
          "symbol": "API",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_filings",
          "line": 60,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "line": 324,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 47,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "financial_statements",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "financial_statements",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 164,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\nINSERT INTO financial_statements (\n    corporate_number, edinet_doc_id, period_end, period_type, consolidated,\n    currency, revenue, operating_profit, ordinary_profit, net_income,\n    total_assets, total_liabilities, total_equity, cash_and_equivalents,\n    employees, eps, bps, raw_xbrl_s3_key, source_id, raw_doc_id, fetched_at\n) VALUES (\n    %(corporate_number)s, %(edinet_doc_id)s, %(period_end)s, %(period_type)s, %(consolidated)s,\n    %(currency)s, %(revenue)s, %(operating_profit)s, %(ordinary_profit)s, %(net_income)s,\n    %(total_assets)s, %(total_liabilities)s, %(total_equity)s, %(cash_and_equivalents)s,\n    %(employees)s, %(eps)s, %(bps)s, %(raw_xbrl_s3_key)s, %(source_id)s, %(raw_doc_id)s, now()\n)\nON CONFLICT (corporate_number, period_end, period_type, consolidated) DO UPDATE SET\n    -- gbizinfo target=06 が先に入れた行は EDINET 値で上書き (より権威的)\n    edinet_doc_id        = COALESCE(EXCLUDED.edinet_doc_id, financial_statements.edinet_doc_id),\n    revenue              = COALESCE(EXCLUDED.reve"
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_establishment_from_edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 346,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 331,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nUPDATE companies\n   SET establishment_date   = %s,\n       establishment_source = 'edinet_xbrl'\n WHERE corporate_number = %s\n   AND (establishment_source IS NULL\n        OR establishment_source IN ('nta_post_2015', 'website')\n        OR (establishment_source = 'edinet_xbrl' AND establishment_date IS DISTINCT FROM %s))\n"
        }
      ],
      "dimensions": [
        7
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "backfill",
      "schedule_plans": [
        {
          "task": "tyc-establishment-edinet.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 04:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.backfill_establishment_from_edinet --incremental",
          "modules": [
            "backend.scripts.backfill_establishment_from_edinet"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+00:00",
              "beijing": "2026-11-04T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+00:00",
              "beijing": "2026-11-05T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+00:00",
              "beijing": "2026-11-06T12:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-establishment-edinet.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 04:30:00 UTC ; next_elapse=Wed 2026-11-04 04:30:00 UTC }\nNextElapseUSecRealtime=Wed 2026-11-04 04:30:00 UTC\nLastTriggerUSec=Tue 2026-11-03 04:30:01 UTC\nId=tyc-establishment-edinet.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_shareholders.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_shareholders",
          "enabled": true,
          "line": 318
        }
      ],
      "table": "shareholders",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "shareholders",
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 465,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                    INSERT INTO shareholders (\n                        corporate_number, holder_name, holder_corporate_number,\n                        is_natural_person, joint_holders, ratio, shares, rank,\n                        as_of, source_id, raw_doc_id, fetched_at\n                    ) VALUES (\n                        %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now()\n                    )\n                    ON CONFLICT (corporate_number, holder_name, as_of)\n                    DO UPDATE SET\n                        holder_corporate_number = COALESCE(EXCLUDED.holder_corporate_number, shareholders.holder_corporate_number),\n                        is_natural_person       = EXCLUDED.is_natural_person,\n                        joint_holders           = EXCLUDED.joint_holders,\n                        ratio                   = EXCLUDED.ratio,\n                        shares                  = EXCLUDED.shares,\n                        rank                    = EXCLUDED.rank,\n              "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_shareholders",
          "line": 318,
          "module_chain": [
            "backend.scripts.fetch_edinet_shareholders"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "edinet_shareholders",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.scripts.fetch_edinet_shareholders",
          "modules": [
            "backend.scripts.fetch_edinet_shareholders"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 318,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_subsidiaries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_subsidiaries",
          "enabled": true,
          "line": 331
        }
      ],
      "table": "company_relationships",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_relationships",
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 413,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_relationships (\n    parent_corporate_number, child_corporate_number, child_name,\n    relationship_type, ownership_pct, child_country, child_business_description,\n    as_of, source_id, doc_id_edinet, doc_type_code, parser_version, meta\n) VALUES (\n    %(parent_corporate_number)s, %(child_corporate_number)s, %(child_name)s,\n    %(relationship_type)s, %(ownership_pct)s, %(child_country)s, %(child_business_description)s,\n    %(as_of)s, %(source_id)s, %(doc_id_edinet)s, %(doc_type_code)s, %(parser_version)s, %(meta)s\n)\nON CONFLICT (parent_corporate_number, child_name, doc_id_edinet) DO UPDATE SET\n    child_corporate_number = COALESCE(EXCLUDED.child_corporate_number, company_relationships.child_corporate_number),\n    relationship_type = EXCLUDED.relationship_type,\n    ownership_pct = EXCLUDED.ownership_pct,\n    child_country = EXCLUDED.child_country,\n    child_business_description = EXCLUDED.child_business_description,\n    as_of = EXCLUDED.as_of,\n    parser_version = EXCL"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_subsidiaries",
          "line": 331,
          "module_chain": [
            "backend.scripts.fetch_edinet_subsidiaries"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "edinet_subsidiaries",
          "scheduler": "schedule.yaml",
          "cron": "0 10 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 10:00",
          "command": "python3 -m backend.scripts.fetch_edinet_subsidiaries",
          "modules": [
            "backend.scripts.fetch_edinet_subsidiaries"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T10:00:00+09:00",
              "beijing": "2026-12-01T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T10:00:00+09:00",
              "beijing": "2027-01-01T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T10:00:00+09:00",
              "beijing": "2027-02-01T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 331,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/import_edinet_codelist.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_edinet_codelist.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/import_edinet_codelist.py",
          "line": 46,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                UPDATE companies\n                   SET edinet_code = %s,\n                       ticker = %s,\n                       is_listed = %s,\n                       listed_market = CASE WHEN %s THEN 'TSE' ELSE NULL END,\n                       last_updated_at = now()\n                 WHERE corporate_number = %s\n            "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "edinet_foreign_capital_derived",
      "crawler": "backend/scripts/derive_foreign_capital.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 78,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_foreign_capital_derived",
          "enabled": true,
          "line": 337
        }
      ],
      "table": "company_foreign_capital",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_foreign_capital",
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 304,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_foreign_capital (\n    corporate_number, foreign_capital_country, foreign_capital_pct,\n    top_foreign_shareholder, top_foreign_shareholder_country,\n    top_foreign_shareholder_ratio, n_foreign_holders,\n    derived_from, latest_filing_as_of, meta\n) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\nON CONFLICT (corporate_number) DO UPDATE SET\n    foreign_capital_country         = EXCLUDED.foreign_capital_country,\n    foreign_capital_pct             = EXCLUDED.foreign_capital_pct,\n    top_foreign_shareholder         = EXCLUDED.top_foreign_shareholder,\n    top_foreign_shareholder_country = EXCLUDED.top_foreign_shareholder_country,\n    top_foreign_shareholder_ratio   = EXCLUDED.top_foreign_shareholder_ratio,\n    n_foreign_holders               = EXCLUDED.n_foreign_holders,\n    derived_from                    = EXCLUDED.derived_from,\n    latest_filing_as_of             = EXCLUDED.latest_filing_as_of,\n    derived_at                      = now(),\n    meta                    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "EDINET 大株主から導出した外資出資情報",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_foreign_capital_derived",
          "line": 337,
          "module_chain": [
            "backend.scripts.derive_foreign_capital"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "derived",
      "schedule_plans": [
        {
          "task": "edinet_foreign_capital_derived",
          "scheduler": "schedule.yaml",
          "cron": "30 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:30",
          "command": "python3 -m backend.scripts.derive_foreign_capital",
          "modules": [
            "backend.scripts.derive_foreign_capital"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:30:00+09:00",
              "beijing": "2026-12-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:30:00+09:00",
              "beijing": "2027-01-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:30:00+09:00",
              "beijing": "2027-02-01T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 337,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 500,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers (\n            corporate_number, person_id, position,\n            source_id, raw_doc_id, fetched_at, meta,\n            resigned_at\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s::jsonb, %s::date)\n        ON CONFLICT (corporate_number, person_id, position) DO UPDATE\n          SET resigned_at = COALESCE(officers.resigned_at, EXCLUDED.resigned_at),\n              meta = COALESCE(officers.meta, '{}'::jsonb) || EXCLUDED.meta,\n              fetched_at = EXCLUDED.fetched_at\n        "
        },
        {
          "table": "officers",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 485,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE officers\n               SET resigned_at = %s::date,\n                   meta = COALESCE(meta, '{}'::jsonb) || %s::jsonb,\n                   fetched_at = %s,\n                   raw_doc_id = COALESCE(%s, raw_doc_id),\n                   source_id = %s\n             WHERE id = %s\n            "
        },
        {
          "table": "officers",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 475,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                UPDATE officers\n                   SET meta = COALESCE(meta, '{}'::jsonb) || %s::jsonb,\n                       fetched_at = %s\n                 WHERE id = %s\n                "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 422,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons (display_name, search_name, birth_year_hash, status, meta)\n        VALUES (%s, %s, %s, 'unverified', %s::jsonb)\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 462,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers (\n            corporate_number, person_id, position,\n            source_id, raw_doc_id, fetched_at, meta,\n            appointed_at\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s::jsonb, %s::date)\n        "
        },
        {
          "table": "officers",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 448,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE officers\n               SET fetched_at=%s,\n                   raw_doc_id=%s,\n                   meta=%s::jsonb,\n                   source_id=%s,\n                   appointed_at=COALESCE(%s::date, appointed_at)\n             WHERE id=%s\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 411,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons (display_name, search_name, birth_year_hash, status, meta)\n        VALUES (%s, %s, %s, 'unverified', %s::jsonb)\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "egov_law",
      "crawler": "backend/crawlers/sources/egov_law.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 137,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "egov_law",
          "enabled": true,
          "line": 1057
        }
      ],
      "table": "laws",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "laws",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 64,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO laws (\n            law_id, law_num, law_num_era, law_num_year, law_type,\n            title, title_kana, abbrev, category,\n            promulgation_date, enforcement_date,\n            repeal_status, repeal_date, current_revision,\n            source_id, fetched_at, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s,\n            %s, %s, %s,\n            %s, now(), %s::jsonb\n        )\n        ON CONFLICT (law_id) DO UPDATE SET\n            title = EXCLUDED.title,\n            category = EXCLUDED.category,\n            repeal_status = EXCLUDED.repeal_status,\n            repeal_date = EXCLUDED.repeal_date,\n            enforcement_date = EXCLUDED.enforcement_date,\n            current_revision = EXCLUDED.current_revision,\n            fetched_at = now()\n        RETURNING (xmax = 0) AS is_insert\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "e-Gov 法令検索 API",
      "source_url": "https://laws.e-gov.go.jp/apitop/",
      "crawler_url_candidates": [
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "API",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "url",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 118,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "egov_law",
          "line": 1057,
          "module_chain": [
            "backend.crawlers.sources.egov_law"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "egov_law",
          "scheduler": "schedule.yaml",
          "cron": "0 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:00",
          "command": "python3 -m backend.crawlers.sources.egov_law",
          "modules": [
            "backend.crawlers.sources.egov_law"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:00:00+09:00",
              "beijing": "2026-11-04T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:00:00+09:00",
              "beijing": "2026-11-05T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:00:00+09:00",
              "beijing": "2026-11-06T16:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1057,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ehime_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ehime_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 316,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, '代表者', %s, now(),\n           jsonb_build_object(\n             'via', 'ehime_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛媛県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ehime.jp/page/9773.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ehime.jp/page/9773.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "ehime_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ehime_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 289,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'ehime_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛媛県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ehime.jp/page/9773.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ehime.jp/page/9773.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 71,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO business_licenses\n              (corporate_number, license_type, authority, issued_date, source_id, raw_doc_id, fetched_at, meta)\n            VALUES ((SELECT corporate_number FROM companies WHERE corporate_number=%s),\n                    %s, '資源エネルギー庁', %s, %s, %s, now(), %s::jsonb)\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_retail_electric",
      "crawler": "backend/scripts/import_enecho_retail_electric_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_electric",
          "enabled": true,
          "line": 740
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 275,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_build_object(\n                  'via', 'enecho_retail_electric',\n                  'raw_name', %s::text,\n                  'registration_number', %s::text,\n                  'company_name', %s::text,\n                  'prefecture', %s::text,\n                  'address', %s::text,\n                  'registered_on', %s::text,\n                  'pause_start', %s::text,\n                  'pause_end', %s::text,\n                  'source_url', %s::text\n                ),\n                'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録小売電気事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/list.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_electric",
          "line": 740,
          "module_chain": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_electric",
          "scheduler": "schedule.yaml",
          "cron": "0 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:00",
          "command": "python3 -m backend.scripts.import_enecho_retail_electric_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:00:00+09:00",
              "beijing": "2026-11-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:00:00+09:00",
              "beijing": "2026-12-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:00:00+09:00",
              "beijing": "2027-01-08T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 740,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_retail_electric",
      "crawler": "backend/scripts/import_enecho_retail_electric_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_electric",
          "enabled": true,
          "line": 740
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 256,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.74, 'active',\n                jsonb_build_object(\n                  'enecho_retail_electric_corp', %s::text,\n                  'source', 'enecho_retail_electric'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録小売電気事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/list.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_electric",
          "line": 740,
          "module_chain": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_electric",
          "scheduler": "schedule.yaml",
          "cron": "0 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:00",
          "command": "python3 -m backend.scripts.import_enecho_retail_electric_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:00:00+09:00",
              "beijing": "2026-11-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:00:00+09:00",
              "beijing": "2026-12-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:00:00+09:00",
              "beijing": "2027-01-08T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 740,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_retail_gas",
      "crawler": "backend/scripts/import_enecho_retail_gas_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_gas",
          "enabled": true,
          "line": 752
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 227,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id, fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_strip_nulls(jsonb_build_object(\n                  'via', 'enecho_retail_gas',\n                  'registration_number', %s::text,\n                  'source_url', %s::text,\n                  'company_name_at_source', %s::text,\n                  'address_at_source', %s::text,\n                  'raw_position', %s::text,\n                  'raw_name', %s::text,\n                  'phone', %s::text,\n                  'area', %s::text,\n                  'household_sales', %s::text,\n                  'registered_on', %s::text,\n                  'planned_start_on', %s::text\n                )),\n                'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録ガス小売事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 33,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_gas",
          "line": 752,
          "module_chain": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_gas",
          "scheduler": "schedule.yaml",
          "cron": "20 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:20",
          "command": "python3 -m backend.scripts.import_enecho_retail_gas_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:20:00+09:00",
              "beijing": "2026-11-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:20:00+09:00",
              "beijing": "2026-12-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:20:00+09:00",
              "beijing": "2027-01-08T04:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 752,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_retail_gas",
      "crawler": "backend/scripts/import_enecho_retail_gas_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_gas",
          "enabled": true,
          "line": 752
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 208,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.82, 'active',\n                jsonb_build_object(\n                  'enecho_retail_gas_corp', %s::text,\n                  'source', 'enecho_retail_gas'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録ガス小売事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 33,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_gas",
          "line": 752,
          "module_chain": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_gas",
          "scheduler": "schedule.yaml",
          "cron": "20 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:20",
          "command": "python3 -m backend.scripts.import_enecho_retail_gas_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:20:00+09:00",
              "beijing": "2026-11-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:20:00+09:00",
              "beijing": "2026-12-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:20:00+09:00",
              "beijing": "2027-01-08T04:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 752,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/crawlers/sources/env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 118,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "env_sanpai",
          "enabled": true,
          "line": 139
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 196,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                                INSERT INTO business_licenses\n                                  (corporate_number, license_type, license_no, authority,\n                                   issued_date, expires_date, status, source_id, fetched_at, meta)\n                                VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n                                ON CONFLICT (dedup_key) DO NOTHING\n                            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www2.sanpainet.or.jp/sanpai/search_list.php",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "env_sanpai",
          "line": 139,
          "module_chain": [
            "backend.crawlers.sources.env_sanpai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "env_sanpai",
          "scheduler": "schedule.yaml",
          "cron": "50 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:50",
          "command": "python3 -m backend.crawlers.sources.env_sanpai",
          "modules": [
            "backend.crawlers.sources.env_sanpai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:50:00+09:00",
              "beijing": "2026-11-04T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:50:00+09:00",
              "beijing": "2026-11-05T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:50:00+09:00",
              "beijing": "2026-11-06T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 139,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "company_industry_inferred",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_industry_inferred",
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 60,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nWITH eligible AS (\n    SELECT DISTINCT bl.corporate_number\n    FROM business_licenses bl\n    JOIN data_sources ds ON ds.id = bl.source_id\n    WHERE ds.code = %(source_code)s\n      AND bl.corporate_number IS NOT NULL\n      AND bl.license_type = 'industrial_waste_disposal'\n)\nINSERT INTO company_industry_inferred AS cii\n       (corporate_number, industry_code, industry_name,\n        industry_jsic_mid, industry_signals, confidence,\n        inferred_at, updated_at)\nSELECT e.corporate_number,\n       %(mid_code)s::varchar(16),\n       %(mid_name)s::varchar(255),\n       ARRAY[%(mid_code)s]::text[],\n       jsonb_build_object(%(mid_code)s::text, jsonb_build_array(%(source_kind)s::text)),\n       %(conf)s::numeric,\n       now(), now()\nFROM eligible e\nON CONFLICT (corporate_number) DO UPDATE\nSET industry_jsic_mid =\n        CASE WHEN cii.industry_jsic_mid IS NULL\n             THEN ARRAY[%(mid_code)s]::text[]\n             WHEN %(mid_code)s = ANY(cii.industry_jsic_mid)\n             THEN cii.industry_j"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 993,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "欧州委員会 反トラスト・カルテル決定",
      "source_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 242,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "EU Sanctions",
      "source_url": "https://www.sanctionsmap.eu/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/fben.py",
          "line": 489,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO professionals (\n                                profession_type, registration_no,\n                                display_name, search_name, name_kana,\n                                bar_association,\n                                office_name, office_corporate_number,\n                                office_address,\n                                registered_at, status,\n                                source_id, source_url, fetched_at, meta\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, NULL, %s, %s, %s,\n                                %s, %s, %s, %s::jsonb\n                            )\n                            ON CONFLICT (profession_type, registration_no)\n                            DO UPDATE SET\n                                display_name = EXCLUDED.display_name,\n                                search_name = EXCLUDED.search_name,\n                                name_kana = EXCLUDED.name"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2620,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "source_url": "https://www.fcg-r.co.jp/research/incident.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.fcg-r.co.jp/research/incident.html",
          "symbol": "FCG_INCIDENT_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 59,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 101,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_actions",
          "enabled": true,
          "line": 97
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 行政処分",
      "source_url": "https://www.fsa.go.jp/news/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "EXCEL_URL",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 178,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_actions",
          "line": 97,
          "module_chain": [
            "backend.crawlers.sources.fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_license_lists",
          "enabled": true,
          "line": 1146
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 413,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO business_licenses (\n                  corporate_number, license_type, license_no, authority,\n                  issued_date, expires_date, status, source_id, raw_doc_id,\n                  fetched_at, meta\n                ) VALUES (\n                  %(corporate_number)s, %(license_type)s, %(license_no)s,\n                  %(authority)s, %(issued_date)s, NULL, %(status)s, %(source_id)s,\n                  %(raw_doc_id)s, %(fetched_at)s, %(meta)s::jsonb\n                )\n                ON CONFLICT (dedup_key) DO UPDATE SET\n                  corporate_number = COALESCE(EXCLUDED.corporate_number, business_licenses.corporate_number),\n                  license_no = EXCLUDED.license_no,\n                  authority = EXCLUDED.authority,\n                  issued_date = EXCLUDED.issued_date,\n                  status = EXCLUDED.status,\n                  raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, business_licenses.raw_doc_id),\n                  fetched_at = EXCLUDED.fet"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "source_url": "https://data.e-gov.go.jp/data/group/fsa",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx: {dynamic}",
          "symbol": "msg",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 494,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 159,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 291,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_license_lists",
          "line": 1146,
          "module_chain": [
            "backend.crawlers.sources.fsa_license_lists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_money_lender",
      "crawler": "backend/scripts/import_fsa_money_lender_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_money_lender",
          "enabled": true,
          "line": 770
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 400,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id, fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(),\n                jsonb_strip_nulls(jsonb_build_object(\n                  'via', 'fsa_money_lender',\n                  'source_url', %s::text,\n                  'registration_number', %s::text,\n                  'registered_on', %s::text,\n                  'lender_name_at_source', %s::text,\n                  'postal_code_at_source', %s::text,\n                  'address_at_source', %s::text,\n                  'phone', %s::text,\n                  'raw_name', %s::text,\n                  'representative_kana', %s::text,\n                  'data_updated_on', %s::text,\n                  'association_member_number', %s::text,\n                  'match_method', %s::text\n                )),\n                'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "金融庁 登録貸金業者情報検索サービス",
      "source_url": "https://clearing.fsa.go.jp/kashikin/index.php",
      "crawler_url_candidates": [
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "source_url",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 518,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_money_lender",
          "line": 770,
          "module_chain": [
            "backend.scripts.import_fsa_money_lender_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "fsa_money_lender",
          "scheduler": "schedule.yaml",
          "cron": "40 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:40",
          "command": "python3 -m backend.scripts.import_fsa_money_lender_reps --download --apply",
          "modules": [
            "backend.scripts.import_fsa_money_lender_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:40:00+09:00",
              "beijing": "2026-11-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:40:00+09:00",
              "beijing": "2026-12-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:40:00+09:00",
              "beijing": "2027-01-08T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 770,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_money_lender",
      "crawler": "backend/scripts/import_fsa_money_lender_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_money_lender",
          "enabled": true,
          "line": 770
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 381,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active',\n                jsonb_build_object(\n                  'fsa_money_lender_corp', %s::text,\n                  'source', 'fsa_money_lender'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "金融庁 登録貸金業者情報検索サービス",
      "source_url": "https://clearing.fsa.go.jp/kashikin/index.php",
      "crawler_url_candidates": [
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "source_url",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 518,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_money_lender",
          "line": 770,
          "module_chain": [
            "backend.scripts.import_fsa_money_lender_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "fsa_money_lender",
          "scheduler": "schedule.yaml",
          "cron": "40 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:40",
          "command": "python3 -m backend.scripts.import_fsa_money_lender_reps --download --apply",
          "modules": [
            "backend.scripts.import_fsa_money_lender_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:40:00+09:00",
              "beijing": "2026-11-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:40:00+09:00",
              "beijing": "2026-12-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:40:00+09:00",
              "beijing": "2027-01-08T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 770,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 53,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 163,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, status, source_id, fetched_at, meta\n        ) VALUES (%s, %s, %s, %s, %s, 'active', %s, now(), %s::jsonb)\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融商品取引業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fukui_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_fukui_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'fukui_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'expiry_date', %s::text,\n             'jurisdiction', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福井県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fukui_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_fukui_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 297,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'fukui_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福井県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fukuoka_medical_corporation_reports",
      "crawler": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 593,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'report_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福岡県医療法人事業報告書等",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fukuoka_medical_corporation_reports",
      "crawler": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 570,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.84, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福岡県医療法人事業報告書等",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 105,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE companies SET "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 117,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                        INSERT INTO company_aliases (corporate_number, alias, alias_type, source, fetched_at)\n                        VALUES (%s, %s, 'english', 'gbizinfo', now())\n                        ON CONFLICT (corporate_number, alias, alias_type) DO NOTHING\n                    "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "awards",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "awards",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 283,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO awards (corporate_number, award_name, category, awarded_at,\n                                    awarded_for, authority, source_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 339,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, expires_at, scope,\n                   source_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 131,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE companies SET "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 141,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_aliases (corporate_number, alias, alias_type, source, fetched_at)\n            VALUES (%s, %s, 'english', 'gbizinfo', now())\n            ON CONFLICT (corporate_number, alias, alias_type) DO NOTHING\n        "
        },
        {
          "table": "company_aliases",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 148,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_aliases (corporate_number, alias, alias_type, source, fetched_at)\n            VALUES (%s, %s, 'kana', 'gbizinfo', now())\n            ON CONFLICT (corporate_number, alias, alias_type) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "financial_statements",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "financial_statements",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 508,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO financial_statements\n                  (corporate_number, edinet_doc_id, period_end, period_type,\n                   consolidated, revenue, ordinary_profit, net_income,\n                   total_assets, total_equity, employees, source_id, fetched_at)\n                VALUES (%s, %s, %s, 'annual', true, %s, %s, %s, %s, %s, %s, %s, now())\n                ON CONFLICT (corporate_number, period_end, period_type, consolidated) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "government_contracts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "government_contracts",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 196,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO government_contracts\n                  (corporate_number, contract_type, authority, title, amount_jpy,\n                   contract_date, period_from, period_to, program_id,\n                   source_id, fetched_at, meta)\n                VALUES (%s, 'subsidy', %s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        },
        {
          "table": "government_contracts",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 406,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO government_contracts\n                  (corporate_number, contract_type, authority, title, amount_jpy,\n                   contract_date, period_from, period_to, program_id,\n                   source_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "intellectual_properties",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "intellectual_properties",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 470,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO intellectual_properties\n              (corporate_number, ip_type, title, registration_no, status,\n               applicant_name, registered_date, source_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, 'registered', %s, %s, %s, now(), %s)\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "workforce_disclosures",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "workforce_disclosures",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 582,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO workforce_disclosures\n                  (corporate_number, category, item, content, source_id, fetched_at)\n                VALUES (%s, %s, %s, %s, %s, now())\n            "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/backfill_representative.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 337,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/backfill_representative.py",
          "line": 253,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_build_object('via', 'gbizinfo_v1_hojin'),\n                'roster')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/v1/hojin/{corp}",
          "symbol": "GBIZ_API",
          "file": "backend/scripts/backfill_representative.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/backfill_representative.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 337,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/backfill_representative.py",
          "line": 234,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.5, 'active',\n                jsonb_build_object('gbiz_corp', %s::text, 'source', 'gbizinfo'),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/v1/hojin/{corp}",
          "symbol": "GBIZ_API",
          "file": "backend/scripts/backfill_representative.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/import_gbizinfo_json_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 249,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 209,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO officers\n              (corporate_number, person_id, position, source_id,\n               fetched_at, meta, role_tier)\n            SELECT c.corporate_number,\n                   p.id,\n                   c.parsed_position,\n                   %s,\n                   now(),\n                   jsonb_build_object(\n                     'via', 'gbizinfo_json_download',\n                     'source_file', c.source_file,\n                     'raw_representative', c.raw_representative,\n                     'update_date', c.update_date\n                   ),\n                   'roster'\n            FROM tmp_gbizinfo_json_candidates c\n            JOIN persons p\n              ON p.display_name = c.parsed_name\n             AND p.resolution_method = 'unmerged'\n             AND p.meta->>'gbiz_corp' = c.corporate_number\n            ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/import_gbizinfo_json_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 249,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO persons\n              (display_name, search_name, resolution_method, resolution_confidence,\n               status, meta, created_at)\n            SELECT c.parsed_name,\n                   c.parsed_name,\n                   'unmerged',\n                   0.5,\n                   'active',\n                   jsonb_build_object(\n                     'gbiz_corp', c.corporate_number,\n                     'source', 'gbizinfo_json_download',\n                     'source_file', c.source_file,\n                     'raw_representative', c.raw_representative\n                   ),\n                   now()\n            FROM tmp_gbizinfo_json_candidates c\n            WHERE NOT EXISTS (\n                SELECT 1\n                FROM persons p\n                WHERE p.display_name = c.parsed_name\n                  AND p.resolution_method = 'unmerged'\n                  AND p.meta->>'gbiz_corp' = c.corporate_number\n            )\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 223,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE companies\n           SET website_url=%s,\n               website_url_source='gbizinfo_html',\n               website_verified_at=now(),\n               website_confidence=90,\n               last_updated_at=now()\n         WHERE corporate_number=%s\n           AND website_url IS NULL\n    "
        },
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 339,
          "origin": "online",
          "kind": "sql_write",
          "sql": "apply UPDATE companies.website_url for the dry-run hits"
        }
      ],
      "dimensions": [
        1,
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 125,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers (\n            corporate_number, person_id, position,\n            source_id, raw_doc_id, fetched_at, meta\n        )\n        VALUES (%s, %s, %s, %s, %s, %s, %s::jsonb)\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 108,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons (display_name, search_name, birth_year_hash, status, meta)\n        VALUES (%s, %s, NULL, 'unverified', %s::jsonb)\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 223,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE companies\n           SET website_url=%s,\n               website_url_source='gbizinfo_html',\n               website_verified_at=now(),\n               website_confidence=90,\n               last_updated_at=now()\n         WHERE corporate_number=%s\n           AND website_url IS NULL\n    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 111,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers (\n            corporate_number, person_id, position,\n            source_id, raw_doc_id, fetched_at, meta\n        )\n        VALUES (%s, %s, %s, %s, %s, %s, %s::jsonb)\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 98,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons (display_name, search_name, birth_year_hash, status, meta)\n        VALUES (%s, %s, NULL, 'unverified', %s::jsonb)\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_html",
          "enabled": true,
          "line": 616
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 223,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE companies\n           SET website_url=%s,\n               website_url_source='gbizinfo_html',\n               website_verified_at=now(),\n               website_confidence=90,\n               last_updated_at=now()\n         WHERE corporate_number=%s\n           AND website_url IS NULL\n    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 223,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE companies\n           SET website_url=%s,\n               website_url_source='gbizinfo_html',\n               website_verified_at=now(),\n               website_confidence=90,\n               last_updated_at=now()\n         WHERE corporate_number=%s\n           AND website_url IS NULL\n    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 223,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE companies\n           SET website_url=%s,\n               website_url_source='gbizinfo_html',\n               website_verified_at=now(),\n               website_confidence=90,\n               last_updated_at=now()\n         WHERE corporate_number=%s\n           AND website_url IS NULL\n    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 127,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "geps",
          "enabled": true,
          "line": 648
        }
      ],
      "table": "government_contracts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "government_contracts",
          "file": "backend/crawlers/sources/geps.py",
          "line": 224,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                                INSERT INTO government_contracts\n                                  (corporate_number, contract_type, authority, title,\n                                   amount_jpy, contract_date, period_from, period_to,\n                                   source_id, source_url, raw_doc_id, fetched_at, meta)\n                                VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n                            "
        },
        {
          "table": "government_contracts",
          "file": "backend/crawlers/sources/geps.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                                    INSERT INTO government_contracts\n                                      (corporate_number, contract_type, authority, title,\n                                       amount_jpy, contract_date, period_from, period_to,\n                                       source_id, source_url, raw_doc_id, fetched_at, meta)\n                                    VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n                                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/geps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "url",
          "file": "backend/crawlers/sources/geps.py",
          "line": 82,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "geps",
          "line": 648,
          "module_chain": [
            "backend.crawlers.sources.geps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gifu_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_gifu_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 306,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'gifu_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岐阜県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.gifu.lg.jp/page/3670.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gifu.lg.jp/page/3670.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gifu_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_gifu_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 286,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'gifu_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岐阜県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.gifu.lg.jp/page/3670.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gifu.lg.jp/page/3670.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_notices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_notices",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 404,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_notices (\n            canonical_key, notice_type, notice_subtype, published_on, issue_id,\n            issue_kind, issue_no, page_start, page_end, section1, section2,\n            section3, title, body, body_hash, extraction_method, notice_payload,\n            review_status, updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s, %s::jsonb,\n            %s, now()\n        )\n        ON CONFLICT (canonical_key)\n        DO UPDATE SET\n            notice_type = EXCLUDED.notice_type,\n            notice_subtype = EXCLUDED.notice_subtype,\n            issue_id = EXCLUDED.issue_id,\n            page_start = EXCLUDED.page_start,\n            page_end = EXCLUDED.page_end,\n            section1 = EXCLUDED.section1,\n            section2 = EXCLUDED.section2,\n            section3 = EXCLUDED.section3,\n            title = EXCLUDED.title,\n            body = COALESCE(EXCLUDED.body, kanpo_notices.body),\n          "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_source_records",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_source_records",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 474,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_source_records (\n            notice_id, source_id, source_record_type, source_record_id,\n            source_url, source_url_hash, raw_doc_id, raw_doc_fetched_at,\n            source_published_on, source_title, source_issue_date,\n            source_issue_kind, source_issue_no, source_page_start,\n            source_page_end, source_payload, extracted_payload,\n            parser_version, confidence, fetched_at\n        ) VALUES (\n            %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s, %s,\n            %s, %s, %s,\n            %s, %s::jsonb, %s::jsonb,\n            %s, %s, now()\n        )\n        ON CONFLICT (source_id, source_url_hash)\n        DO UPDATE SET\n            notice_id = COALESCE(EXCLUDED.notice_id, kanpo_source_records.notice_id),\n            raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, kanpo_source_records.raw_doc_id),\n            raw_doc_fetched_at = COALESCE(EXCLUDED.raw_doc_fetched_at, kanpo_source_records.raw_doc_fetched_at),\n       "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "government_procurement_suspensions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "government_procurement_suspensions",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 541,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                    INSERT INTO government_procurement_suspensions (\n                      source_id, source_code, authority, jurisdiction, procurement_domain,\n                      business_name, business_name_raw, corporate_number, vendor_number, address,\n                      measure_date, published_date, effective_from, effective_to, period_text, scope_area,\n                      reason_category, reason_detail, legal_basis, source_url, source_record_key,\n                      raw_doc_id, raw_row, parser_version, fetched_at\n                    ) VALUES (\n                      %(source_id)s, %(source_code)s, %(authority)s, %(jurisdiction)s, %(procurement_domain)s,\n                      %(business_name)s, %(business_name_raw)s, %(corporate_number)s, %(vendor_number)s, %(address)s,\n                      %(measure_date)s, %(published_date)s, %(effective_from)s, %(effective_to)s, %(period_text)s, %(scope_area)s,\n                      %(reason_category)s, %(reason_detail)s, %(legal_basis"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gunma_medical_corporation_reports",
      "crawler": "backend/scripts/import_gunma_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gunma_medical_corporation_reports",
          "enabled": true,
          "line": 902
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 550,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'report_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "群馬県医療法人事業報告書等",
      "source_url": "https://www.pref.gunma.jp/page/716575.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gunma.jp/page/716575.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gunma_medical_corporation_reports",
          "line": 902,
          "module_chain": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "gunma_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "30 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:30",
          "command": "python3 -m backend.scripts.import_gunma_medical_corporation_reps --max-zips 6 --max-pdfs 600 --ocr-missing --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:30:00+09:00",
              "beijing": "2027-01-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:30:00+09:00",
              "beijing": "2027-04-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:30:00+09:00",
              "beijing": "2027-07-10T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 902,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gunma_medical_corporation_reports",
      "crawler": "backend/scripts/import_gunma_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gunma_medical_corporation_reports",
          "enabled": true,
          "line": 902
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 527,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.84, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "群馬県医療法人事業報告書等",
      "source_url": "https://www.pref.gunma.jp/page/716575.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gunma.jp/page/716575.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gunma_medical_corporation_reports",
          "line": 902,
          "module_chain": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "gunma_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "30 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:30",
          "command": "python3 -m backend.scripts.import_gunma_medical_corporation_reps --max-zips 6 --max-pdfs 600 --ocr-missing --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:30:00+09:00",
              "beijing": "2027-01-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:30:00+09:00",
              "beijing": "2027-04-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:30:00+09:00",
              "beijing": "2027-07-10T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 902,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 83,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gyoseishoshi",
          "enabled": true,
          "line": 443
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 332,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO professionals (\n    profession_type, registration_no, display_name, search_name, name_kana,\n    bar_association, office_name, office_address, registered_at, status,\n    source_id, source_url, fetched_at, meta\n) VALUES (\n    %(profession_type)s, %(registration_no)s, %(display_name)s, %(search_name)s, %(name_kana)s,\n    %(bar_association)s, %(office_name)s, %(office_address)s, %(registered_at)s, 'active',\n    %(source_id)s, %(source_url)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (profession_type, registration_no) DO UPDATE SET\n    display_name    = EXCLUDED.display_name,\n    search_name     = EXCLUDED.search_name,\n    name_kana       = EXCLUDED.name_kana,\n    bar_association = EXCLUDED.bar_association,\n    office_name     = EXCLUDED.office_name,\n    office_address  = EXCLUDED.office_address,\n    registered_at   = EXCLUDED.registered_at,\n    source_url      = EXCLUDED.source_url,\n    fetched_at      = EXCLUDED.fetched_at,\n    meta            = EXCLUDED.meta\nRETURNING id"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "行政書士検索",
      "source_url": "https://www.gyosei.or.jp/members-search",
      "crawler_url_candidates": [
        {
          "url": "https://www.gyosei.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/api/v1/members/{member_id}",
          "symbol": "DETAIL_URL_FMT",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 407,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gyoseishoshi",
          "line": 443,
          "module_chain": [
            "backend.crawlers.sources.gyoseishoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hanshin_expressway_qualified_suppliers",
      "crawler": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "enabled": true,
          "line": 878
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 308,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "阪神高速道路 有資格者名簿",
      "source_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hanshin_expressway_qualified_suppliers",
      "crawler": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "enabled": true,
          "line": 878
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 288,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.66, 'active', 'show_public',\n                jsonb_build_object(\n                  'hanshin_expressway_corp', %s::text,\n                  'source', 'hanshin_expressway_qualified_supplier_lists'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "阪神高速道路 有資格者名簿",
      "source_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hirakata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_hirakata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 394,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'hirakata_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'license_category', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "枚方市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.hirakata.osaka.jp/0000004004.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "hirakata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_hirakata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 367,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'hirakata_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "枚方市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.hirakata.osaka.jp/0000004004.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "hojyokin_portal",
      "crawler": "backend/crawlers/sources/hojyokin_portal.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "enabled": false,
          "line": 689
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "enabled": false,
          "line": 696
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "enabled": true,
          "line": 703
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "enabled": true,
          "line": 709
        }
      ],
      "table": "subsidy_programs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "subsidy_programs",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 701,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO subsidy_programs (\n            program_id, program_code, title, catch_phrase, detail,\n            authority, institution_name, target_area, target_employees,\n            subsidy_max_amount_jpy, subsidy_rate,\n            acceptance_start_at, acceptance_end_at,\n            source_id, source_url, fetched_at, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s,\n            %s, %s,\n            %s, %s, now(), %s::jsonb\n        )\n        ON CONFLICT (program_id) DO UPDATE SET\n            title = EXCLUDED.title,\n            catch_phrase = EXCLUDED.catch_phrase,\n            detail = EXCLUDED.detail,\n            authority = EXCLUDED.authority,\n            institution_name = EXCLUDED.institution_name,\n            target_area = EXCLUDED.target_area,\n            target_employees = EXCLUDED.target_employees,\n            subsidy_max_amount_jpy = EXCLUDED.subsidy_max_amount_jpy,\n            subsidy_rate = EXCLUDED.subsidy_rate,\n  "
        },
        {
          "table": "subsidy_programs",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 650,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO subsidy_programs (\n                program_id, program_code, title, catch_phrase, detail,\n                authority, institution_name, target_area, target_employees,\n                subsidy_max_amount_jpy, subsidy_rate,\n                acceptance_start_at, acceptance_end_at,\n                source_id, source_url, fetched_at, meta\n            ) VALUES (\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s,\n                %s, %s,\n                %s, %s, now(), %s::jsonb\n            )\n            ON CONFLICT (program_id) DO UPDATE SET\n                title = CASE\n                    WHEN COALESCE(subsidy_programs.meta->>'snapshot_only', 'false') = 'true'\n                    THEN EXCLUDED.title ELSE subsidy_programs.title END,\n                catch_phrase = EXCLUDED.catch_phrase,\n                detail = CASE\n                    WHEN COALESCE(subsidy_programs.meta->>'snapshot_only', 'false') = 'true'\n                         O"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "補助金ポータル 補助金・助成金・支援金",
      "source_url": "https://hojyokin-portal.jp/subsidies/list",
      "crawler_url_candidates": [
        {
          "url": "https://hojyokin-portal.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://hojyokin-portal.jp/subsidies/list",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "line": 703,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "line": 709,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "scheduler": "schedule.yaml",
          "cron": "35 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 03:35",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --max-pages-per-pref 20 --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 689,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "weekly",
          "label": "每周一 03:40",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 696,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 04:10",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --include-ended --list-snapshot-only --sleep 1.0 --list-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 480,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T04:10:00+09:00",
              "beijing": "2026-11-10T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T04:10:00+09:00",
              "beijing": "2026-11-17T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T04:10:00+09:00",
              "beijing": "2026-11-24T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 703,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "scheduler": "schedule.yaml",
          "cron": "55 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:55",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --snapshot-detail-limit 500 --sleep 1.0 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:55:00+09:00",
              "beijing": "2026-11-04T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:55:00+09:00",
              "beijing": "2026-11-05T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:55:00+09:00",
              "beijing": "2026-11-06T03:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 709,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 279,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hotel_ryokan_intl",
          "enabled": true,
          "line": 557
        }
      ],
      "table": "hotel_ryokan_registry",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "hotel_ryokan_registry",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 338,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                        INSERT INTO hotel_ryokan_registry\n                            (corporate_number, registration_no, type, name, address,\n                             prefecture, phone, capacity_rooms, registered_at,\n                             source_id, raw_doc_id, fetched_at, meta)\n                        VALUES (%s,%s,%s,%s,%s,%s,%s,NULL,NULL,%s,%s,now(),%s)\n                        ON CONFLICT (registration_no) DO UPDATE SET\n                            corporate_number = EXCLUDED.corporate_number,\n                            type    = EXCLUDED.type,\n                            name    = EXCLUDED.name,\n                            address = EXCLUDED.address,\n                            prefecture = EXCLUDED.prefecture,\n                            phone   = EXCLUDED.phone,\n                            raw_doc_id = EXCLUDED.raw_doc_id,\n                            fetched_at = now(),\n                            meta    = EXCLUDED.meta\n                        RETURNING (xmax = 0) A"
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "crawler_url_candidates": [
        {
          "url": "https://www.hokoukukan.go.jp/metadata/detail/30",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 66,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hotel_ryokan_intl",
          "line": 557,
          "module_chain": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ibaraki_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 370,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'ibaraki_sanpai_excellent_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'excellent_date', %s::text,\n             'expiry_date', %s::text,\n             'public_url', %s::text,\n             'note', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTH"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "茨城県 優良産廃処理業者認定業者一覧",
      "source_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "ibaraki_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 343,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'ibaraki_sanpai_excellent_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "茨城県 優良産廃処理業者認定業者一覧",
      "source_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "imaj_advice_disclosure",
      "crawler": "backend/scripts/import_imaj_advice_disclosure_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_advice_disclosure",
          "enabled": true,
          "line": 818
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 376,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資助言・代理会員台帳",
      "source_url": "https://www.imaj.or.jp/members/disclosure/advice/",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_advice_disclosure",
          "line": 818,
          "module_chain": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_advice_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "40 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:40",
          "command": "python3 -m backend.scripts.import_imaj_advice_disclosure_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:40:00+09:00",
              "beijing": "2026-11-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:40:00+09:00",
              "beijing": "2026-12-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:40:00+09:00",
              "beijing": "2027-01-08T09:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 818,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "imaj_advice_disclosure",
      "crawler": "backend/scripts/import_imaj_advice_disclosure_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_advice_disclosure",
          "enabled": true,
          "line": 818
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 360,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資助言・代理会員台帳",
      "source_url": "https://www.imaj.or.jp/members/disclosure/advice/",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_advice_disclosure",
          "line": 818,
          "module_chain": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_advice_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "40 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:40",
          "command": "python3 -m backend.scripts.import_imaj_advice_disclosure_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:40:00+09:00",
              "beijing": "2026-11-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:40:00+09:00",
              "beijing": "2026-12-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:40:00+09:00",
              "beijing": "2027-01-08T09:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 818,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "imaj_investment_management_disclosure",
      "crawler": "backend/scripts/import_imaj_investment_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_investment_management_disclosure",
          "enabled": true,
          "line": 824
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 235,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資運用会社要覧",
      "source_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 263,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_investment_management_disclosure",
          "line": 824,
          "module_chain": [
            "backend.scripts.import_imaj_investment_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_investment_management_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "10 11 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 11:10",
          "command": "python3 -m backend.scripts.import_imaj_investment_management_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_investment_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T11:10:00+09:00",
              "beijing": "2026-11-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T11:10:00+09:00",
              "beijing": "2026-12-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T11:10:00+09:00",
              "beijing": "2027-01-08T10:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 824,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "imaj_investment_management_disclosure",
      "crawler": "backend/scripts/import_imaj_investment_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_investment_management_disclosure",
          "enabled": true,
          "line": 824
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 219,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資運用会社要覧",
      "source_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 263,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_investment_management_disclosure",
          "line": 824,
          "module_chain": [
            "backend.scripts.import_imaj_investment_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_investment_management_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "10 11 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 11:10",
          "command": "python3 -m backend.scripts.import_imaj_investment_management_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_investment_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T11:10:00+09:00",
              "beijing": "2026-11-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T11:10:00+09:00",
              "beijing": "2026-12-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T11:10:00+09:00",
              "beijing": "2027-01-08T10:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 824,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "invoice_kohyo",
      "crawler": "backend/crawlers/sources/invoice_kohyo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "invoice_kohyo_monthly",
          "enabled": false,
          "line": 395
        },
        {
          "task": "invoice_kohyo_daily",
          "enabled": false,
          "line": 401
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 388,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE companies c\n           SET invoice_status         = ir.status,\n               invoice_registered_date = ir.registered_date\n          FROM invoice_registrants ir\n         WHERE ir.corporate_number = c.corporate_number\n           AND ir.kind = '法人'\n           AND (c.invoice_status IS DISTINCT FROM ir.status\n                OR c.invoice_registered_date IS DISTINCT FROM ir.registered_date)\n    "
        },
        {
          "table": "companies",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 414,
          "origin": "online",
          "kind": "sql_write",
          "sql": "run UPDATE companies.invoice_status from invoice_registrants and exit"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "適格請求書発行事業者公表サイト",
      "source_url": "https://www.invoice-kohyo.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.invoice-kohyo.nta.go.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.invoice-kohyo.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_INDEX",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.invoice-kohyo.nta.go.jp/download/sabun/",
          "symbol": "SABUN_INDEX",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 91,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "invoice_kohyo_monthly",
          "scheduler": "schedule.yaml",
          "cron": "30 21 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "monthly",
          "label": "每月 1 日 21:30",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode monthly",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 395,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "invoice_kohyo_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 22:00",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode daily",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 401,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "invoice_kohyo",
      "crawler": "backend/crawlers/sources/invoice_kohyo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "invoice_kohyo_monthly",
          "enabled": false,
          "line": 395
        },
        {
          "task": "invoice_kohyo_daily",
          "enabled": false,
          "line": 401
        }
      ],
      "table": "invoice_registrants",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "invoice_registrants",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 175,
          "origin": "online",
          "kind": "declarative_target",
          "sql": ""
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "適格請求書発行事業者公表サイト",
      "source_url": "https://www.invoice-kohyo.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.invoice-kohyo.nta.go.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.invoice-kohyo.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_INDEX",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.invoice-kohyo.nta.go.jp/download/sabun/",
          "symbol": "SABUN_INDEX",
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 91,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "invoice_kohyo_monthly",
          "scheduler": "schedule.yaml",
          "cron": "30 21 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "monthly",
          "label": "每月 1 日 21:30",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode monthly",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 395,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "invoice_kohyo_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 22:00",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode daily",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 401,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "invoice_kohyo_api_v1",
      "crawler": "backend/scripts/import_invoice_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 360,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "invoice_kohyo_api_daily",
          "enabled": true,
          "line": 411
        }
      ],
      "table": "invoice_registrants",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "invoice_registrants",
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 201,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO invoice_registrants ("
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 適格請求書発行事業者 Web-API v1",
      "source_url": "https://web-api.invoice-kohyo.nta.go.jp/1/",
      "crawler_url_candidates": [
        {
          "url": "https://web-api.invoice-kohyo.nta.go.jp/1",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "invoice_kohyo_api_daily",
          "line": 411,
          "module_chain": [
            "backend.scripts.import_invoice_via_api"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "invoice_kohyo_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 22:30",
          "command": "python3 -m backend.scripts.import_invoice_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_invoice_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T22:30:00+09:00",
              "beijing": "2026-11-03T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T22:30:00+09:00",
              "beijing": "2026-11-04T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T22:30:00+09:00",
              "beijing": "2026-11-05T21:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 411,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 412,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications (\n              corporate_number, cert_name, authority, certified_at, expires_at,\n              scope, source_id, raw_doc_id, fetched_at, meta\n            ) VALUES (\n              NULL, %s, %s, NULL, NULL, %s, %s, %s, now(), %s::jsonb\n            )\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "ipa_security_action_declarations",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "ipa_security_action_declarations",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 395,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO ipa_security_action_declarations (\n              source_id, source_record_id, region_code, region_label, pdf_url,\n              pdf_sha256, pdf_row_number, prefecture, organization_name,\n              municipality_address, municipality, industry, action_stage,\n              listed_period, as_of_date, parse_status, parse_confidence,\n              raw_line, raw_doc_id, fetched_at, meta\n            ) VALUES (\n              %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n              %s, %s, %s, %s, now(), %s::jsonb\n            )\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ishikawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ishikawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 312,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'ishikawa_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "石川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "ishikawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ishikawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 292,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'ishikawa_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "石川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "isico_dgnet",
      "crawler": "backend/scripts/import_isico_dgnet_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isico_dgnet",
          "enabled": true,
          "line": 830
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 345,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ISICO DGnet 企業情報",
      "source_url": "https://www.isico.or.jp/company/",
      "crawler_url_candidates": [
        {
          "url": "https://www.isico.or.jp",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.isico.or.jp/company/",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isico_dgnet",
          "line": 830,
          "module_chain": [
            "backend.scripts.import_isico_dgnet_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "isico_dgnet",
          "scheduler": "schedule.yaml",
          "cron": "0 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:00",
          "command": "python3 -m backend.scripts.import_isico_dgnet_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_isico_dgnet_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:00:00+09:00",
              "beijing": "2026-11-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:00:00+09:00",
              "beijing": "2026-12-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:00:00+09:00",
              "beijing": "2027-01-09T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 830,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "isico_dgnet",
      "crawler": "backend/scripts/import_isico_dgnet_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isico_dgnet",
          "enabled": true,
          "line": 830
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 326,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.64, 'active', 'show_public',\n                jsonb_build_object(\n                  'isico_dgnet_corp', %s::text,\n                  'source', 'isico_dgnet_public_directory'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ISICO DGnet 企業情報",
      "source_url": "https://www.isico.or.jp/company/",
      "crawler_url_candidates": [
        {
          "url": "https://www.isico.or.jp",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.isico.or.jp/company/",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isico_dgnet",
          "line": 830,
          "module_chain": [
            "backend.scripts.import_isico_dgnet_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "isico_dgnet",
          "scheduler": "schedule.yaml",
          "cron": "0 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:00",
          "command": "python3 -m backend.scripts.import_isico_dgnet_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_isico_dgnet_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:00:00+09:00",
              "beijing": "2026-11-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:00:00+09:00",
              "beijing": "2026-12-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:00:00+09:00",
              "beijing": "2027-01-09T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 830,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "isms_ac_certified_orgs",
      "crawler": "backend/crawlers/sources/isms_ac.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isms_ac_certified_orgs",
          "enabled": true,
          "line": 1110
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, expires_at,\n                   scope, source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, NULL, now(), %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "ISMS-AC ISMS認証取得組織検索",
      "source_url": "https://isms.jp/lst/ind/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://isms.jp/lst/ind/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isms_ac_certified_orgs",
          "line": 1110,
          "module_chain": [
            "backend.crawlers.sources.isms_ac"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "isms_ac_certified_orgs",
          "scheduler": "schedule.yaml",
          "cron": "10 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:10",
          "command": "python3 -m backend.crawlers.sources.isms_ac --details",
          "modules": [
            "backend.crawlers.sources.isms_ac"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:10:00+09:00",
              "beijing": "2026-12-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:10:00+09:00",
              "beijing": "2027-01-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:10:00+09:00",
              "beijing": "2027-02-03T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1110,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "iwate_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_iwate_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 461,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'iwate_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岩手県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "iwate_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_iwate_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 441,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'iwate_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岩手県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 75,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jaha_animal_hospitals",
          "enabled": true,
          "line": 1001
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 332,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, expires_date, status, source_id, raw_doc_id,\n            fetched_at, meta\n        ) VALUES (%s, %s, NULL, %s, NULL, NULL, 'active', %s, %s, NOW(), %s::jsonb)\n        ON CONFLICT (dedup_key) DO UPDATE SET\n            corporate_number = COALESCE(EXCLUDED.corporate_number, business_licenses.corporate_number),\n            meta = EXCLUDED.meta,\n            fetched_at = NOW()\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "JAHA認定動物病院一覧",
      "source_url": "https://animal-hospital.jaha.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://animal-hospital.jaha.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://animal-hospital.jaha.or.jp/post-sitemap.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jaha_animal_hospitals",
          "line": 1001,
          "module_chain": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 70,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jcia_cosmetics",
          "enabled": true,
          "line": 994
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 272,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, expires_date, status, source_id, raw_doc_id,\n            fetched_at, meta\n        ) VALUES (%s, %s, NULL, %s, NULL, NULL, 'active', %s, %s, NOW(), %s::jsonb)\n        ON CONFLICT (dedup_key) DO UPDATE SET\n            corporate_number = COALESCE(EXCLUDED.corporate_number, business_licenses.corporate_number),\n            meta = EXCLUDED.meta,\n            fetched_at = NOW()\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本化粧品工業会 会員企業一覧",
      "source_url": "https://www.jcia.org/admin/memberlist",
      "crawler_url_candidates": [
        {
          "url": "https://www.jcia.org/admin/memberlist",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.jcia.org/admin/memberlist{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jcia_cosmetics",
          "line": 994,
          "module_chain": [
            "backend.crawlers.sources.jcia_cosmetics"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 176,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jclp",
          "enabled": true,
          "line": 494
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 153,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at, expires_at,\n               scope, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, NULL, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "source_url": "https://japan-clp.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://japan-clp.jp/about/organization",
          "symbol": "URL",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 57,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jclp",
          "line": 494,
          "module_chain": [
            "backend.crawlers.sources.jclp"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/crawlers/sources/jetro_case_studies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jetro_case_studies",
          "enabled": true,
          "line": 1164
        }
      ],
      "table": "jetro_case_studies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jetro_case_studies",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 313,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO jetro_case_studies (\n          source_id, source_record_id, case_url, case_year, company_name, title,\n          description, location_text, website_url, representative_name,\n          established_text, business_content, overseas_regions, jetro_services,\n          body_text, published_text, published_date, profile_fields, raw_profile,\n          fetched_at, updated_at\n        ) VALUES (\n          %(source_id)s, %(source_record_id)s, %(case_url)s, %(case_year)s,\n          %(company_name)s, %(title)s, %(description)s, %(location_text)s,\n          %(website_url)s, %(representative_name)s, %(established_text)s,\n          %(business_content)s, %(overseas_regions)s, %(jetro_services)s,\n          %(body_text)s, %(published_text)s, %(published_date)s,\n          %(profile_fields)s, %(raw_profile)s, now(), now()\n        )\n        ON CONFLICT (source_id, source_record_id) DO UPDATE SET\n          case_url=EXCLUDED.case_url,\n          case_year=EXCLUDED.case_year,\n          compa"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ジェトロ活用事例",
      "source_url": "https://www.jetro.go.jp/case_study/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jetro.go.jp/case_study/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 33,
          "origin": "online"
        },
        {
          "url": "https://www.jetro.go.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jetro_case_studies",
          "line": 1164,
          "module_chain": [
            "backend.crawlers.sources.jetro_case_studies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jetro_case_studies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:30",
          "command": "python3 -m backend.crawlers.sources.jetro_case_studies",
          "modules": [
            "backend.crawlers.sources.jetro_case_studies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:30:00+09:00",
              "beijing": "2026-12-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:30:00+09:00",
              "beijing": "2027-01-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:30:00+09:00",
              "beijing": "2027-02-03T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1164,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 196,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_actions",
          "enabled": true,
          "line": 103
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 排除措置・課徴金",
      "source_url": "https://www.jftc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jftc.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/houdou/pressrelease/dksochi/{year}/index.html",
          "symbol": "INDEX_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/dk/ichiran/dkhaijo_{year}.html",
          "symbol": "ICHIRAN_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_actions",
          "line": 103,
          "module_chain": [
            "backend.crawlers.sources.jftc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "jftc_subcontract_recommendations",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jftc_subcontract_recommendations",
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 318,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO jftc_subcontract_recommendations (\n                  source_id, fiscal_year, serial_no, case_title, company_name,\n                  corporate_number, recommendation_date, summary, violation_article,\n                  violation_category, amount_text, amount_jpy, source_url,\n                  source_record_key, raw_doc_id, raw_row, parser_version, fetched_at\n                ) VALUES (\n                  %(source_id)s, %(fiscal_year)s, %(serial_no)s, %(case_title)s,\n                  %(company_name)s, %(corporate_number)s, %(recommendation_date)s,\n                  %(summary)s, %(violation_article)s, %(violation_category)s,\n                  %(amount_text)s, %(amount_jpy)s, %(source_url)s,\n                  %(source_record_key)s, %(raw_doc_id)s, %(raw_row)s::jsonb,\n                  %(parser_version)s, %(fetched_at)s\n                )\n                ON CONFLICT (source_id, source_record_key) DO UPDATE SET\n                  fiscal_year = EXCLUDED.fiscal_year,\n "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/crawlers/sources/jgoodtech_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "jgoodtech_company_profiles",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jgoodtech_company_profiles",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 325,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO jgoodtech_company_profiles (\n          source_id, jgt_corp_mng_id, created_locale, corporate_number,\n          company_name, company_name_kana, company_name_en, page_url,\n          prefecture_code, prefecture_name, postcode, address, phone, website_url,\n          representative_name, representative_position, established_text,\n          employee_num, full_time_employee_num, capital, sales, industry_name,\n          main_customer_name, product_base_name, sales_base_name, tieup_support_name,\n          catch_statement, lead_sentence, free_described,\n          expand_overseas, overseas_transaction_exists, intention_to_expand_overseas,\n          keywords, sdg_keywords, appeal_sections, cooperation_needs, products,\n          search_overview, outline_payload, appeal_payload, product_payload, detail_flags,\n          fetched_at, updated_at\n        ) VALUES (\n          %(source_id)s, %(jgt_corp_mng_id)s, %(created_locale)s, %(corporate_number)s,\n          %(company_name)s, %(c"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 332,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_build_object(\n                  'via', 'jgoodtech_public_profile',\n                  'raw_name', %s::text,\n                  'source_url', %s::text,\n                  'jgt_corp_mng_id', %s::text,\n                  'created_locale', %s::text,\n                  'update_date', %s::text,\n                  'capital', %s::text,\n                  'address', %s::text\n                ),\n                'jgoodtech_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 312,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.68, 'active', 'show_public',\n                jsonb_build_object(\n                  'jgoodtech_corp', %s::text,\n                  'jgt_corp_mng_id', %s::text,\n                  'source', 'jgoodtech_public_profile'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgrants",
      "crawler": "backend/crawlers/sources/jgrants.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 133,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgrants",
          "enabled": true,
          "line": 1066
        }
      ],
      "table": "subsidy_programs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "subsidy_programs",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 74,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO subsidy_programs (\n            program_id, program_code, title, catch_phrase, detail,\n            authority, institution_name, target_area, target_employees,\n            subsidy_max_amount_jpy, subsidy_rate,\n            acceptance_start_at, acceptance_end_at,\n            source_id, source_url, fetched_at, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s,\n            %s, %s,\n            %s, %s, now(), %s::jsonb\n        )\n        ON CONFLICT (program_id) DO UPDATE SET\n            title = EXCLUDED.title,\n            acceptance_end_at = EXCLUDED.acceptance_end_at,\n            subsidy_max_amount_jpy = EXCLUDED.subsidy_max_amount_jpy,\n            fetched_at = now()\n        RETURNING (xmax = 0) AS is_insert\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "jGrants 補助金",
      "source_url": "https://www.jgrants-portal.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.jgrants-portal.go.jp/exp",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies",
          "symbol": "url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/{dynamic}",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 171,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgrants",
          "line": 1066,
          "module_chain": [
            "backend.crawlers.sources.jgrants"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jgrants",
          "scheduler": "schedule.yaml",
          "cron": "30 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:30",
          "command": "python3 -m backend.crawlers.sources.jgrants",
          "modules": [
            "backend.crawlers.sources.jgrants"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:30:00+09:00",
              "beijing": "2026-11-04T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:30:00+09:00",
              "beijing": "2026-11-05T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:30:00+09:00",
              "beijing": "2026-11-06T16:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1066,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 104,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jicpa_registry",
          "enabled": true,
          "line": 343
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 348,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO professionals (\n    profession_type, registration_no, display_name, search_name, name_kana,\n    bar_association, office_name, office_address, registered_at, status,\n    source_id, source_url, fetched_at, meta\n) VALUES (\n    %(profession_type)s, %(registration_no)s, %(display_name)s, %(search_name)s, %(name_kana)s,\n    %(bar_association)s, %(office_name)s, %(office_address)s, %(registered_at)s, 'active',\n    %(source_id)s, %(source_url)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (profession_type, registration_no) DO UPDATE SET\n    display_name    = EXCLUDED.display_name,\n    search_name     = EXCLUDED.search_name,\n    name_kana       = EXCLUDED.name_kana,\n    bar_association = EXCLUDED.bar_association,\n    office_name     = EXCLUDED.office_name,\n    office_address  = EXCLUDED.office_address,\n    source_url      = EXCLUDED.source_url,\n    fetched_at      = EXCLUDED.fetched_at,\n    meta            = EXCLUDED.meta\nRETURNING id, (xmax = 0) AS inserted\n"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "日本公認会計士協会 公認会計士等検索システム",
      "source_url": "https://registry.jicpa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://registry.jicpa.or.jp/cpa_search",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 92,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 93,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_search",
          "symbol": "AUDIT_LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 95,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "AUDIT_DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 96,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 529,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 422,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jicpa_registry",
          "line": 343,
          "module_chain": [
            "backend.crawlers.sources.jicpa_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jipdec_pmark",
      "crawler": "backend/crawlers/sources/jipdec_pmark.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jipdec_pmark",
          "enabled": true,
          "line": 1104
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 116,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, expires_at,\n                   scope, source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, NULL, now(), %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "JIPDEC プライバシーマーク付与事業者検索",
      "source_url": "https://entity-search.jipdec.or.jp/pmark/",
      "crawler_url_candidates": [
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 34,
          "origin": "online"
        },
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jipdec_pmark",
          "line": 1104,
          "module_chain": [
            "backend.crawlers.sources.jipdec_pmark"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jipdec_pmark",
          "scheduler": "schedule.yaml",
          "cron": "40 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:40",
          "command": "python3 -m backend.crawlers.sources.jipdec_pmark",
          "modules": [
            "backend.crawlers.sources.jipdec_pmark"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:40:00+09:00",
              "beijing": "2026-12-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:40:00+09:00",
              "beijing": "2027-01-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:40:00+09:00",
              "beijing": "2027-02-03T03:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1104,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jnet21_support_programs",
      "crawler": "backend/crawlers/sources/jnet21_support_programs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jnet21_support_programs",
          "enabled": true,
          "line": 677
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "enabled": true,
          "line": 683
        }
      ],
      "table": "subsidy_programs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "subsidy_programs",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 503,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO subsidy_programs (\n            program_id, program_code, title, catch_phrase, detail,\n            authority, institution_name, target_area, target_employees,\n            subsidy_max_amount_jpy, subsidy_rate,\n            acceptance_start_at, acceptance_end_at,\n            source_id, source_url, fetched_at, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s,\n            %s, %s,\n            %s, %s, now(), %s::jsonb\n        )\n        ON CONFLICT (program_id) DO UPDATE SET\n            title = EXCLUDED.title,\n            catch_phrase = EXCLUDED.catch_phrase,\n            detail = EXCLUDED.detail,\n            authority = EXCLUDED.authority,\n            institution_name = EXCLUDED.institution_name,\n            target_area = EXCLUDED.target_area,\n            acceptance_start_at = EXCLUDED.acceptance_start_at,\n            acceptance_end_at = EXCLUDED.acceptance_end_at,\n            source_url = EXCLUDED.source_url,\n          "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-Net21 支援情報ヘッドライン 補助金・助成金・融資",
      "source_url": "https://j-net21.smrj.go.jp/snavi2/",
      "crawler_url_candidates": [
        {
          "url": "https://j-net21.smrj.go.jp/snavi/support/support.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/results.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/",
          "symbol": "DETAIL_BASE",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jnet21_support_programs",
          "line": 677,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "line": 683,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jnet21_support_programs",
          "scheduler": "schedule.yaml",
          "cron": "45 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:45",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode rss --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:45:00+09:00",
              "beijing": "2026-11-04T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:45:00+09:00",
              "beijing": "2026-11-05T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:45:00+09:00",
              "beijing": "2026-11-06T01:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 677,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "scheduler": "schedule.yaml",
          "cron": "20 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 03:20",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode full --shard-prefectures --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T03:20:00+09:00",
              "beijing": "2026-11-09T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T03:20:00+09:00",
              "beijing": "2026-11-16T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T03:20:00+09:00",
              "beijing": "2026-11-23T02:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 683,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "job_placement_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 115,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 440,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO business_licenses\n              (corporate_number, license_type, license_no, authority,\n               issued_date, expires_date, status, source_id, fetched_at, meta)\n            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n            ON CONFLICT (dedup_key) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "有料職業紹介事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "company_ip_profile",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_ip_profile",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 925,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            WITH agg AS (\n              SELECT\n                corporate_number,\n                COUNT(*) FILTER (WHERE ip_type = 'patent')::int AS n_patents_total,\n                COUNT(*) FILTER (WHERE ip_type = 'patent' AND status IN ('registered','granted'))::int AS n_patents_granted,\n                COUNT(*) FILTER (WHERE ip_type = 'patent' AND status = 'pending')::int AS n_patents_pending,\n                COUNT(*) FILTER (\n                  WHERE ip_type = 'patent'\n                    AND COALESCE(applied_date, registered_date) >= CURRENT_DATE - INTERVAL '5 years'\n                )::int AS n_patents_5y,\n                COUNT(*) FILTER (\n                  WHERE ip_type = 'patent'\n                    AND COALESCE(applied_date, registered_date) >= CURRENT_DATE - INTERVAL '1 year'\n                )::int AS n_patents_1y,\n                COUNT(*) FILTER (WHERE ip_type = 'trademark')::int AS n_trademarks,\n                COUNT(*) FILTER (WHERE ip_type = 'design')::int AS n_designs,\n   "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "intellectual_properties",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "intellectual_properties",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 786,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE intellectual_properties\n               SET application_no = COALESCE(%s, application_no),\n                   registration_no = COALESCE(%s, registration_no),\n                   title = COALESCE(%s, title),\n                   status = COALESCE(%s, status),\n                   applicant_name = COALESCE(%s, applicant_name),\n                   applied_date = COALESCE(%s, applied_date),\n                   registered_date = COALESCE(%s, registered_date),\n                   expires_date = COALESCE(%s, expires_date),\n                   raw_doc_id = COALESCE(%s, raw_doc_id),\n                   fetched_at = now(),\n                   meta = jsonb_strip_nulls(COALESCE(meta, '{}'::jsonb) || %s::jsonb)\n             WHERE id = %s\n            "
        },
        {
          "table": "intellectual_properties",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 869,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE intellectual_properties\n               SET application_no = COALESCE(%s, application_no),\n                   registration_no = COALESCE(%s, registration_no),\n                   title = COALESCE(%s, title),\n                   status = COALESCE(%s, status),\n                   applicant_name = COALESCE(%s, applicant_name),\n                   applied_date = COALESCE(%s, applied_date),\n                   registered_date = COALESCE(%s, registered_date),\n                   raw_doc_id = COALESCE(%s, raw_doc_id),\n                   fetched_at = now(),\n                   meta = jsonb_strip_nulls(COALESCE(meta, '{}'::jsonb) || %s::jsonb)\n             WHERE id = %s\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "jpo_trademark_enrichment",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jpo_trademark_enrichment",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 645,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO jpo_trademark_enrichment (\n                ip_id, source_id, corporate_number, registration_no, application_no,\n                status, jpo_status_code, remain_access_count, jplatpat_url,\n                case_reference, registration_info, progress_simple, fixed_address,\n                error_message, attempt_count, last_attempt_at, next_retry_at,\n                fetched_at, updated_at\n            ) VALUES (\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s::jsonb, %s::jsonb, %s::jsonb, %s::jsonb,\n                %s, 1, now(), %s,\n                CASE WHEN %s = 'success' THEN now() ELSE NULL END,\n                now()\n            )\n            ON CONFLICT (ip_id) DO UPDATE SET\n                source_id = EXCLUDED.source_id,\n                corporate_number = EXCLUDED.corporate_number,\n                registration_no = EXCLUDED.registration_no,\n                application_no = COALESCE(EXCLUDED.application_no, jpo_trademark_en"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "kind": "database_field_lineage",
          "column": "is_listed"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "companies",
      "status": "declared_lineage",
      "table_evidence": [
        {
          "kind": "database_field_lineage",
          "column": "is_listed",
          "parser_module": "backend/crawlers/sources/jpx_listed.py"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 149,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 141,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO company_aliases (corporate_number, alias, alias_type, source, fetched_at)\n        VALUES (%s, %s, 'jpx_ticker', 'jpx_listed', now())\n        ON CONFLICT (corporate_number, alias, alias_type) DO NOTHING\n    "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_members",
      "crawler": "backend/scripts/import_jsda_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jsda_members",
          "enabled": true,
          "line": 812
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 399,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "日本証券業協会 会員名簿",
      "source_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jsda_members",
          "line": 812,
          "module_chain": [
            "backend.scripts.import_jsda_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jsda_members",
          "scheduler": "schedule.yaml",
          "cron": "10 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:10",
          "command": "python3 -m backend.scripts.import_jsda_member_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_jsda_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:10:00+09:00",
              "beijing": "2026-11-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:10:00+09:00",
              "beijing": "2026-12-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:10:00+09:00",
              "beijing": "2027-01-08T09:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 812,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_members",
      "crawler": "backend/scripts/import_jsda_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jsda_members",
          "enabled": true,
          "line": 812
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 383,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "日本証券業協会 会員名簿",
      "source_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jsda_members",
          "line": 812,
          "module_chain": [
            "backend.scripts.import_jsda_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jsda_members",
          "scheduler": "schedule.yaml",
          "cron": "10 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:10",
          "command": "python3 -m backend.scripts.import_jsda_member_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_jsda_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:10:00+09:00",
              "beijing": "2026-11-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:10:00+09:00",
              "beijing": "2026-12-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:10:00+09:00",
              "beijing": "2027-01-08T09:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 812,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 355,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'kagawa_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "香川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 328,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'kagawa_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "香川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kagoshima_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 274,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'kagoshima_sanpai_excellent_waste_licensee_html',\n             'source_url', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'db_address', %s::text,\n             'permit_numbers', %s::text,\n             'certification_dates', %s::text,\n             'public_url', %s::text,\n             'industrial_collection', %s::text,\n             'industrial_disposal', %s::text,\n             'special_collection', %s::text,\n             'special_disposal', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "鹿児島県 優良産廃処理業者認定基準適合処理業者一覧",
      "source_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 328,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kagoshima_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 247,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'kagoshima_sanpai_excellent_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_numbers', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "鹿児島県 優良産廃処理業者認定基準適合処理業者一覧",
      "source_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 328,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 275,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 293,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaigo_facilities",
          "enabled": true,
          "line": 455
        }
      ],
      "table": "care_facilities",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "care_facilities",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 226,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO care_facilities (\n                corporate_number, service_type, service_code, prefecture, city,\n                facility_code, name, name_kana, company_name, address,\n                phone, fax, homepage_url, capacity, lat, lng,\n                source_id, raw_doc_id, fetched_at, meta\n            ) VALUES (\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, %s, %s::jsonb\n            )\n            ON CONFLICT (facility_code, service_type) DO UPDATE SET\n                corporate_number = EXCLUDED.corporate_number,\n                service_code = EXCLUDED.service_code,\n                prefecture = EXCLUDED.prefecture,\n                city = EXCLUDED.city,\n                name = EXCLUDED.name,\n                name_kana = EXCLUDED.name_kana,\n                company_name = EXCLUDED.company_name,\n                address = EXCLUDED.address,\n                phone = EXCLUDED.phone,\n     "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "厚労省 介護サービス情報公表システム オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 63,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 64,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaigo_facilities",
          "line": 455,
          "module_chain": [
            "backend.crawlers.sources.kaigo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 132,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO business_licenses (\n                                corporate_number, license_type, license_no, authority,\n                                source_id, raw_doc_id, fetched_at, meta\n                            ) VALUES (%s, '介護事業所', %s, '厚生労働省',\n                                      %s, NULL, %s, %s::jsonb)\n                        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 介護サービス情報公表",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 381,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 363,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaken",
      "crawler": "backend/crawlers/sources/kaken_research_projects.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 30,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaken",
          "enabled": true,
          "line": 1170
        }
      ],
      "table": "kaken_research_projects",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kaken_research_projects",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 202,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO kaken_research_projects (\n                  source_id, project_id, project_number, systematic_number, title,\n                  project_type, research_category, review_section, institution,\n                  principal_investigator_name, principal_investigator_affiliation,\n                  project_period_text, start_date, end_date, project_status,\n                  allocation_text, total_allocation_thousand_yen, direct_cost_thousand_yen,\n                  source_url, search_keywords, detail_fields, raw_summary, fetched_at, updated_at\n                ) VALUES (\n                  %(source_id)s, %(project_id)s, %(project_number)s, %(systematic_number)s, %(title)s,\n                  %(project_type)s, %(research_category)s, %(review_section)s, %(institution)s,\n                  %(principal_investigator_name)s, %(principal_investigator_affiliation)s,\n                  %(project_period_text)s, %(start_date)s, %(end_date)s, %(project_status)s,\n                  %(al"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "KAKEN 科学研究費助成事業データベース",
      "source_url": "https://kaken.nii.ac.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kaken.nii.ac.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://kaken.nii.ac.jp/ja/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 32,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaken",
          "line": 1170,
          "module_chain": [
            "backend.crawlers.sources.kaken_research_projects"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaken",
          "scheduler": "schedule.yaml",
          "cron": "55 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:55",
          "command": "python3 -m backend.crawlers.sources.kaken_research_projects --rows 100 --max-pages 10 --request-delay 0.08",
          "modules": [
            "backend.crawlers.sources.kaken_research_projects"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:55:00+09:00",
              "beijing": "2026-11-10T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:55:00+09:00",
              "beijing": "2026-11-17T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:55:00+09:00",
              "beijing": "2026-11-24T07:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1170,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kanagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 299,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'kanagawa_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'phone', %s::text,\n             'business_type', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "神奈川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kanagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kanagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 272,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'kanagawa_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "神奈川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_issues",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_issues",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 373,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_issues (\n            issue_date, issue_kind, issue_kind_code, issue_no, edition_key,\n            fullcontents_url, source_id, source_payload, fetched_at, updated_at\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb, now(), now())\n        ON CONFLICT (issue_date, issue_kind, issue_no)\n        DO UPDATE SET\n            fullcontents_url = COALESCE(EXCLUDED.fullcontents_url, kanpo_issues.fullcontents_url),\n            source_payload = kanpo_issues.source_payload || EXCLUDED.source_payload,\n            updated_at = now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_notices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_notices",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 404,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_notices (\n            canonical_key, notice_type, notice_subtype, published_on, issue_id,\n            issue_kind, issue_no, page_start, page_end, section1, section2,\n            section3, title, body, body_hash, extraction_method, notice_payload,\n            review_status, updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s, %s::jsonb,\n            %s, now()\n        )\n        ON CONFLICT (canonical_key)\n        DO UPDATE SET\n            notice_type = EXCLUDED.notice_type,\n            notice_subtype = EXCLUDED.notice_subtype,\n            issue_id = EXCLUDED.issue_id,\n            page_start = EXCLUDED.page_start,\n            page_end = EXCLUDED.page_end,\n            section1 = EXCLUDED.section1,\n            section2 = EXCLUDED.section2,\n            section3 = EXCLUDED.section3,\n            title = EXCLUDED.title,\n            body = COALESCE(EXCLUDED.body, kanpo_notices.body),\n          "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_source_records",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_source_records",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 474,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_source_records (\n            notice_id, source_id, source_record_type, source_record_id,\n            source_url, source_url_hash, raw_doc_id, raw_doc_fetched_at,\n            source_published_on, source_title, source_issue_date,\n            source_issue_kind, source_issue_no, source_page_start,\n            source_page_end, source_payload, extracted_payload,\n            parser_version, confidence, fetched_at\n        ) VALUES (\n            %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s, %s,\n            %s, %s, %s,\n            %s, %s::jsonb, %s::jsonb,\n            %s, %s, now()\n        )\n        ON CONFLICT (source_id, source_url_hash)\n        DO UPDATE SET\n            notice_id = COALESCE(EXCLUDED.notice_id, kanpo_source_records.notice_id),\n            raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, kanpo_source_records.raw_doc_id),\n            raw_doc_fetched_at = COALESCE(EXCLUDED.raw_doc_fetched_at, kanpo_source_records.raw_doc_fetched_at),\n       "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 251,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 275,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kanpo_tremolo",
          "enabled": true,
          "line": 640
        }
      ],
      "table": "financial_statements",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "financial_statements",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 218,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO financial_statements\n          (corporate_number, edinet_doc_id, fiscal_period_no, period_end,\n           period_type, consolidated, currency,\n           revenue, operating_profit, ordinary_profit, net_income,\n           total_assets, total_liabilities, total_equity,\n           source_id, raw_doc_id, fetched_at)\n        VALUES (%s, NULL, %s, %s, 'annual', false, 'JPY',\n                %s, %s, %s, %s,\n                %s, %s, %s, %s, %s, now())\n        ON CONFLICT (corporate_number, period_end, period_type, consolidated)\n        DO NOTHING\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "官報決算データサービス (tremolo)",
      "source_url": "https://kanpo.tremolo.work/",
      "crawler_url_candidates": [
        {
          "url": "https://kanpo.tremolo.work",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/kessan",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/{id}",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_tremolo",
          "line": 640,
          "module_chain": [
            "backend.crawlers.sources.kanpo_tremolo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 248,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "keidanren_members",
          "enabled": true,
          "line": 363
        }
      ],
      "table": "company_associations",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_associations",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 216,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO company_associations\n                  (corporate_number, name, association_name, member_type,\n                   member_since, source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n                ON CONFLICT (association_name, name, member_type) DO UPDATE SET\n                  corporate_number = EXCLUDED.corporate_number,\n                  source_id        = EXCLUDED.source_id,\n                  raw_doc_id       = EXCLUDED.raw_doc_id,\n                  fetched_at       = EXCLUDED.fetched_at,\n                  meta             = EXCLUDED.meta\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経団連 会員一覧",
      "source_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/",
          "symbol": "PORTAL",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 271,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "keidanren_members",
          "line": 363,
          "module_chain": [
            "backend.crawlers.sources.keidanren_members"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 283,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 296,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kenko_keiei",
          "enabled": true,
          "line": 482
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 263,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at, expires_at,\n               scope, insurer, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営優良法人認定 (経産省/日本健康会議)",
      "source_url": "https://kenko-keiei.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kenko-keiei.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://kenko-keiei.jp/houjin_list/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kenko_keiei",
          "line": 482,
          "module_chain": [
            "backend.crawlers.sources.kenko_keiei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 676,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 562,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, scope,\n                   source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "bid_notices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "bid_notices",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 417,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO bid_notices (\n            source_id, source_record_id, dedupe_key, source_url, external_document_uri, raw_doc_id,\n            title, project_name, organization_name, authority,\n            lg_code, prefecture, city_code, city,\n            category, procedure_type, certification, location, item_code,\n            cft_issue_date, tender_submission_deadline, opening_tenders_event,\n            period_end_time, retrieved_at,\n            file_type, file_size, project_description, attachments,\n            notice_status, search_segment, meta, fetched_at, parser_version,\n            updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s, %s, %s, %s,\n            %s, %s, %s,\n            %s, %s,\n            %s, %s, %s, %s::jsonb,\n            %s, %s::jsonb, %s::jsonb, %s, %s,\n            now()\n        )\n        ON CONFLICT (source_id, source_record_id) DO UPDATE SET\n            dedupe_key = EXC"
        },
        {
          "table": "bid_notices",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 641,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO bid_notices (\n                source_id, source_record_id, dedupe_key, source_url, external_document_uri, raw_doc_id,\n                title, project_name, organization_name, authority,\n                lg_code, prefecture, city_code, city,\n                category, procedure_type, certification, location, item_code,\n                cft_issue_date, tender_submission_deadline, opening_tenders_event,\n                period_end_time, retrieved_at,\n                file_type, file_size, project_description, attachments,\n                notice_status, search_segment, meta, fetched_at, parser_version,\n                updated_at\n            ) VALUES "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "koeki_info_representatives",
      "crawler": "backend/scripts/import_koeki_info_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 44,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "koeki_info_representatives",
          "enabled": true,
          "line": 836
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 389,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公益法人information 公益法人等詳細",
      "source_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
      "crawler_url_candidates": [
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 415,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "koeki_info_representatives",
          "line": 836,
          "module_chain": [
            "backend.scripts.import_koeki_info_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "koeki_info_representatives",
          "scheduler": "schedule.yaml",
          "cron": "30 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:30",
          "command": "python3 -m backend.scripts.import_koeki_info_representatives --start-page 1 --max-pages 6 --disp-number 100 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_koeki_info_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:30:00+09:00",
              "beijing": "2026-11-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:30:00+09:00",
              "beijing": "2026-12-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:30:00+09:00",
              "beijing": "2027-01-09T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 836,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "koeki_info_representatives",
      "crawler": "backend/scripts/import_koeki_info_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 44,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "koeki_info_representatives",
          "enabled": true,
          "line": 836
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 373,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公益法人information 公益法人等詳細",
      "source_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
      "crawler_url_candidates": [
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 415,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "koeki_info_representatives",
          "line": 836,
          "module_chain": [
            "backend.scripts.import_koeki_info_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "koeki_info_representatives",
          "scheduler": "schedule.yaml",
          "cron": "30 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:30",
          "command": "python3 -m backend.scripts.import_koeki_info_representatives --start-page 1 --max-pages 6 --disp-number 100 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_koeki_info_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:30:00+09:00",
              "beijing": "2026-11-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:30:00+09:00",
              "beijing": "2026-12-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:30:00+09:00",
              "beijing": "2027-01-09T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 836,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kokodesearch_childcare_facility_csv",
      "crawler": "backend/scripts/import_kokodesearch_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "enabled": true,
          "line": 842
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 462,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV",
      "source_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E00.do",
          "symbol": "CSV_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E06.do",
          "symbol": "CSV_DOWNLOAD_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 599,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "line": 842,
          "module_chain": [
            "backend.scripts.import_kokodesearch_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "scheduler": "schedule.yaml",
          "cron": "0 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:00",
          "command": "python3 -m backend.scripts.import_kokodesearch_representatives --apply",
          "modules": [
            "backend.scripts.import_kokodesearch_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:00:00+09:00",
              "beijing": "2026-11-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:00:00+09:00",
              "beijing": "2026-12-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:00:00+09:00",
              "beijing": "2027-01-09T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 842,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kokodesearch_childcare_facility_csv",
      "crawler": "backend/scripts/import_kokodesearch_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "enabled": true,
          "line": 842
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 444,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.82, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV",
      "source_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E00.do",
          "symbol": "CSV_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E06.do",
          "symbol": "CSV_DOWNLOAD_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 599,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "line": 842,
          "module_chain": [
            "backend.scripts.import_kokodesearch_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "scheduler": "schedule.yaml",
          "cron": "0 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:00",
          "command": "python3 -m backend.scripts.import_kokodesearch_representatives --apply",
          "modules": [
            "backend.scripts.import_kokodesearch_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:00:00+09:00",
              "beijing": "2026-11-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:00:00+09:00",
              "beijing": "2026-12-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:00:00+09:00",
              "beijing": "2027-01-09T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 842,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kumamoto_religious_corporations",
      "crawler": "backend/scripts/import_kumamoto_religious_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kumamoto_religious_corporations",
          "enabled": true,
          "line": 890
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 270,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'religion_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "熊本県 宗教法人名簿",
      "source_url": "https://data.bodik.jp/dataset/430005_00107",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/d8ad9958-6493-4ddd-96f7-d15e4a00c0ef/resource/5c7a5bbb-b91a-4af1-a5e0-679ee25f6716/download/123_r7.8.1.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kumamoto_religious_corporations",
          "line": 890,
          "module_chain": [
            "backend.scripts.import_kumamoto_religious_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kumamoto_religious_corporations",
          "scheduler": "schedule.yaml",
          "cron": "30 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:30",
          "command": "python3 -m backend.scripts.import_kumamoto_religious_reps --apply",
          "modules": [
            "backend.scripts.import_kumamoto_religious_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:30:00+09:00",
              "beijing": "2027-01-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:30:00+09:00",
              "beijing": "2027-04-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:30:00+09:00",
              "beijing": "2027-07-10T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 890,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kumamoto_religious_corporations",
      "crawler": "backend/scripts/import_kumamoto_religious_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kumamoto_religious_corporations",
          "enabled": true,
          "line": 890
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 254,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "熊本県 宗教法人名簿",
      "source_url": "https://data.bodik.jp/dataset/430005_00107",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/d8ad9958-6493-4ddd-96f7-d15e4a00c0ef/resource/5c7a5bbb-b91a-4af1-a5e0-679ee25f6716/download/123_r7.8.1.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kumamoto_religious_corporations",
          "line": 890,
          "module_chain": [
            "backend.scripts.import_kumamoto_religious_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kumamoto_religious_corporations",
          "scheduler": "schedule.yaml",
          "cron": "30 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:30",
          "command": "python3 -m backend.scripts.import_kumamoto_religious_reps --apply",
          "modules": [
            "backend.scripts.import_kumamoto_religious_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:30:00+09:00",
              "beijing": "2027-01-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:30:00+09:00",
              "beijing": "2027-04-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:30:00+09:00",
              "beijing": "2027-07-10T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 890,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 48,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 163,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO business_licenses (\n            corporate_number, license_type, license_no, authority,\n            issued_date, status, source_id, fetched_at, meta\n        ) VALUES (%s, %s, %s, %s, %s, 'active', %s, now(), %s::jsonb)\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "登録貸金業者検索",
      "source_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "awards",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "awards",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7820,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO awards\n              (corporate_number, award_name, category, awarded_at, awarded_for,\n               authority, source_id, raw_doc_id, fetched_at, meta)\n            VALUES\n              (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n            RETURNING id\n            "
        },
        {
          "table": "awards",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7782,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                UPDATE awards\n                   SET corporate_number = %s,\n                       award_name = %s,\n                       category = %s,\n                       awarded_at = %s,\n                       awarded_for = %s,\n                       authority = coalesce(%s, authority),\n                       raw_doc_id = %s,\n                       fetched_at = %s,\n                       meta = %s\n                 WHERE id = %s\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "local_public_recognitions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "local_public_recognitions",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7688,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO local_public_recognitions\n              (source_id, source_url, source_record_id, raw_doc_id, title, authority,\n               jurisdiction_type, prefecture, municipality, department, published_at,\n               event_date, award_name, award_rank, award_category, recipient_type,\n               recipient_name, recipient_location, summary, recognition_context,\n               corporate_number, person_id, match_confidence, extraction_method,\n               match_notes, body_extracted, fetched_at, parser_version)\n            VALUES\n              (%(source_id)s, %(source_url)s, %(source_record_id)s, %(raw_doc_id)s,\n               %(title)s, %(authority)s, %(jurisdiction_type)s, %(prefecture)s,\n               %(municipality)s, %(department)s, %(published_at)s, %(event_date)s,\n               %(award_name)s, %(award_rank)s, %(award_category)s, %(recipient_type)s,\n               %(recipient_name)s, %(recipient_location)s, %(summary)s,\n               %(recognition_contex"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7608,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO persons\n              (display_name, search_name, resolution_method, resolution_confidence,\n               status, display_policy, meta)\n            VALUES\n              (%s, %s, 'local_public_recognition', 0.55, 'unverified', 'show_full', %s)\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "maebashi_sanpai_disposal_waste_licensees",
      "crawler": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 339,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, '代表者', %s, now(),\n           jsonb_build_object(\n             'via', 'maebashi_sanpai_disposal_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'postal_code', %s::text,\n             'phone', %s::text,\n             'business_category', %s::text,\n             'treatment_type', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, positi"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "前橋市 産業廃棄物処分業者名簿",
      "source_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "maebashi_sanpai_disposal_waste_licensees",
      "crawler": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 312,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'maebashi_sanpai_disposal_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "前橋市 産業廃棄物処分業者名簿",
      "source_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 351,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 392,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "medical_facilities",
          "enabled": true,
          "line": 461
        }
      ],
      "table": "medical_facilities",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "medical_facilities",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 302,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO medical_facilities (\n                corporate_number, facility_type, license_no, name, name_kana,\n                address, prefecture, city, opened_at, beds, departments,\n                operator_name, homepage_url, lat, lng,\n                source_id, raw_doc_id, fetched_at, meta\n            ) VALUES (\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s, %s, %s::jsonb\n            )\n            ON CONFLICT (license_no, prefecture) DO UPDATE SET\n                corporate_number = EXCLUDED.corporate_number,\n                facility_type = EXCLUDED.facility_type,\n                name = EXCLUDED.name,\n                name_kana = EXCLUDED.name_kana,\n                address = EXCLUDED.address,\n                city = EXCLUDED.city,\n                opened_at = EXCLUDED.opened_at,\n                beds = EXCLUDED.beds,\n                departments = EXCLUDED.departments,\n                operat"
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "医療機能情報提供制度 全国オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CONTENT_BASE",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "medical_facilities",
          "line": 461,
          "module_chain": [
            "backend.crawlers.sources.medical_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_alcohol",
      "crawler": "backend/scripts/import_meti_alcohol_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_alcohol",
          "enabled": true,
          "line": 758
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 299,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id, fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(),\n                jsonb_strip_nulls(jsonb_build_object(\n                  'via', 'meti_alcohol',\n                  'source_url', %s::text,\n                  'list_title', %s::text,\n                  'jurisdiction', %s::text,\n                  'source_created_on', %s::text,\n                  'permit_number', %s::text,\n                  'permit_date', %s::text,\n                  'company_name_at_source', %s::text,\n                  'company_address_at_source', %s::text,\n                  'office_name', %s::text,\n                  'office_address', %s::text,\n                  'raw_name', %s::text,\n                  'representative_prefecture', %s::text\n                )),\n                'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "経済産業省 アルコール事業者名簿",
      "source_url": "https://www.meti.go.jp/policy/alcohol/openlist/",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "base_url",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 159,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_alcohol",
          "line": 758,
          "module_chain": [
            "backend.scripts.import_meti_alcohol_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "meti_alcohol",
          "scheduler": "schedule.yaml",
          "cron": "40 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:40",
          "command": "python3 -m backend.scripts.import_meti_alcohol_reps --download --apply",
          "modules": [
            "backend.scripts.import_meti_alcohol_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:40:00+09:00",
              "beijing": "2026-11-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:40:00+09:00",
              "beijing": "2026-12-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:40:00+09:00",
              "beijing": "2027-01-08T04:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 758,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_alcohol",
      "crawler": "backend/scripts/import_meti_alcohol_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_alcohol",
          "enabled": true,
          "line": 758
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 280,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.84, 'active',\n                jsonb_build_object(\n                  'meti_alcohol_corp', %s::text,\n                  'source', 'meti_alcohol'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "経済産業省 アルコール事業者名簿",
      "source_url": "https://www.meti.go.jp/policy/alcohol/openlist/",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "base_url",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 159,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_alcohol",
          "line": 758,
          "module_chain": [
            "backend.scripts.import_meti_alcohol_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "meti_alcohol",
          "scheduler": "schedule.yaml",
          "cron": "40 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:40",
          "command": "python3 -m backend.scripts.import_meti_alcohol_reps --download --apply",
          "modules": [
            "backend.scripts.import_meti_alcohol_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:40:00+09:00",
              "beijing": "2026-11-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:40:00+09:00",
              "beijing": "2026-12-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:40:00+09:00",
              "beijing": "2027-01-08T04:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 758,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_bcp_keizokuryoku",
          "enabled": true,
          "line": 1152
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 688,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications (\n                  corporate_number, cert_name, authority, certified_at, expires_at,\n                  scope, source_id, raw_doc_id, fetched_at, meta\n                ) VALUES (\n                  NULL, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb\n                )\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "source_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list",
          "symbol": "DOWNLOAD_BASE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list/renkei_nintei_ichiran.xlsx",
          "symbol": "RENKEI_URL",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "source_page_url",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 268,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_bcp_keizokuryoku",
          "line": 1152,
          "module_chain": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3061,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "経産省 外国ユーザーリスト",
      "source_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "METI_FOREIGN_USER_PRESS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "METI_FOREIGN_USER_PDF_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3098,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "fallback_pdf_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3183,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 380,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_actions",
          "enabled": true,
          "line": 133
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "crawler_url_candidates": [
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "fallback",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 212,
          "origin": "online"
        },
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "landing_url",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 217,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_actions",
          "line": 133,
          "module_chain": [
            "backend.crawlers.sources.mhlw_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 365,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_koyou_fraud",
          "enabled": true,
          "line": 581
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
          "symbol": "UMBRELLA_URL",
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_koyou_fraud",
          "line": 581,
          "module_chain": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/scripts/import_public_representative_clues.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "public_representative_clues",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "public_representative_clues",
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 257,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n    INSERT INTO public_representative_clues (\n        corporate_number, company_name, raw_representative, display_name,\n        position, name_parse_status, evidence_kind, evidence_scope, confidence,\n        source_id, source_table, source_row_id, source_url, observed_at,\n        fetched_at, extraction_method, meta\n    ) VALUES (\n        %s, %s, %s, %s,\n        %s, %s, %s, %s, %s,\n        %s, %s, %s, %s, %s,\n        %s, %s, %s\n    )\n    ON CONFLICT (source_id, source_table, source_row_id, corporate_number, raw_representative)\n    DO UPDATE SET\n        company_name = EXCLUDED.company_name,\n        display_name = EXCLUDED.display_name,\n        position = EXCLUDED.position,\n        name_parse_status = EXCLUDED.name_parse_status,\n        evidence_kind = EXCLUDED.evidence_kind,\n        evidence_scope = EXCLUDED.evidence_scope,\n        confidence = EXCLUDED.confidence,\n        source_url = EXCLUDED.source_url,\n        observed_at = EXCLUDED.observed_at,\n        fetched_at = EXCLUDED.fetched"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "awards",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "awards",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 262,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO awards\n                  (corporate_number, award_name, category, awarded_at, awarded_for,\n                   authority, source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 245,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, expires_at,\n                   scope, source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "workforce_disclosures",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "workforce_disclosures",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 228,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO workforce_disclosures\n                  (corporate_number, category, item, content, disclosed_at,\n                   source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "miyagi_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 340,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, '代表者', %s, now(),\n           jsonb_build_object(\n             'via', 'miyagi_sanpai_excellent_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'public_url', %s::text,\n             'excellent_certified', %s::text,\n             'excellent_confirmed', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, pers"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "宮城県 優良産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "miyagi_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 313,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'miyagi_sanpai_excellent_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "宮城県 優良産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "mlit_chintai_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 39,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 436,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 賃貸住宅管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_chintai_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 39,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 420,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 賃貸住宅管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 84,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_jidosha",
          "enabled": true,
          "line": 160
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 自動車事業者処分",
      "source_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 130,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_jidosha",
          "line": 160,
          "module_chain": [
            "backend.crawlers.sources.jidosha"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jutaku_shukuhaku_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 57,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 436,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 住宅宿泊管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jutaku_shukuhaku_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 57,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 420,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 住宅宿泊管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_mansion_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 48,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 436,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 マンション管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_mansion_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 48,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 420,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 マンション管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 144,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 32,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 215,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_negative_extended",
          "enabled": true,
          "line": 923
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "NEGA_SEARCH_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/content/001913487.xlsx",
          "symbol": "RYOKOU_XLSX_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 59,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "RYOKOU_PAGE_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 243,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_negative_extended",
          "line": 923,
          "module_chain": [
            "backend.crawlers.sources.mlit_negative_extended"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 93,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mof_sanctions",
          "enabled": true,
          "line": 54
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "外務省 経済制裁",
      "source_url": "https://www.mofa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mof.go.jp/policy/international_policy/gaitame_kawase/gaitame/economic_sanctions/list.html",
          "symbol": "LIST_PAGE",
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mof_sanctions",
          "line": 54,
          "module_chain": [
            "backend.crawlers.sources.mof_sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "moj_e_koukoku_notice_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "moj_e_koukoku_notice_documents",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 393,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO moj_e_koukoku_notice_documents (\n            source_id, notice_id, source_record_id, notice_url, raw_doc_id, raw_doc_fetched_at,\n            document_file_type, document_content_type, http_status, bytes_size,\n            text_extract_status, text_extract_method, page_count, text_length,\n            extracted_text, extracted_fields, extracted_urls, error_message,\n            fetched_at, parsed_at, parser_version, updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s, %s, %s,\n            %s, %s::jsonb, %s::jsonb, %s,\n            %s, now(), %s, now()\n        )\n        ON CONFLICT (source_id, source_record_id, notice_url) DO UPDATE SET\n            notice_id = EXCLUDED.notice_id,\n            raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, moj_e_koukoku_notice_documents.raw_doc_id),\n            raw_doc_fetched_at = COALESCE(EXCLUDED.raw_doc_fetched_at, moj_e_koukoku_notice_documents.raw_doc_fetched_at),\n            do"
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "moj_e_koukoku_notices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "moj_e_koukoku_notices",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 469,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO moj_e_koukoku_notices (\n                source_id, source_record_id, source_url, raw_doc_id,\n                company_name, company_name_kana, legal_clause, notice_url,\n                notice_url_host, notice_file_type, notice_start_date, notice_end_date,\n                head_office_location, remarks, notice_status, row_index,\n                source_last_modified, source_etag, source_updated_label,\n                source_payload, fetched_at, last_seen_at, parser_version, updated_at\n            ) VALUES (\n                %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s, %s,\n                %s::jsonb, %s, %s, %s, now()\n            )\n            ON CONFLICT (source_id, source_record_id) DO UPDATE SET\n                raw_doc_id = COALESCE(EXCLUDED.raw_doc_id, moj_e_koukoku_notices.raw_doc_id),\n                company_name = EXCLUDED.company_name,\n                company_name_kana ="
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_registered_support_org",
      "crawler": "backend/scripts/import_moj_registered_support_org_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_registered_support_org",
          "enabled": true,
          "line": 764
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 346,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id, fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(),\n                jsonb_strip_nulls(jsonb_build_object(\n                  'via', 'moj_registered_support_org',\n                  'source_url', %s::text,\n                  'source_as_of', %s::text,\n                  'registration_number', %s::text,\n                  'registered_on', %s::text,\n                  'company_name_at_source', %s::text,\n                  'postal_code_at_source', %s::text,\n                  'company_address_at_source', %s::text,\n                  'office_name', %s::text,\n                  'office_postal_code', %s::text,\n                  'office_address', %s::text,\n                  'raw_name', %s::text,\n                  'languages', %s::text,\n                  'match_method', %s::text\n                )),\n                'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHIN"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "出入国在留管理庁 登録支援機関登録簿",
      "source_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 463,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_registered_support_org",
          "line": 764,
          "module_chain": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "moj_registered_support_org",
          "scheduler": "schedule.yaml",
          "cron": "10 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:10",
          "command": "python3 -m backend.scripts.import_moj_registered_support_org_reps --download --apply",
          "modules": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:10:00+09:00",
              "beijing": "2026-11-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:10:00+09:00",
              "beijing": "2026-12-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:10:00+09:00",
              "beijing": "2027-01-08T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 764,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_registered_support_org",
      "crawler": "backend/scripts/import_moj_registered_support_org_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_registered_support_org",
          "enabled": true,
          "line": 764
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 327,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active',\n                jsonb_build_object(\n                  'moj_registered_support_org_corp', %s::text,\n                  'source', 'moj_registered_support_org'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "出入国在留管理庁 登録支援機関登録簿",
      "source_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 463,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_registered_support_org",
          "line": 764,
          "module_chain": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "moj_registered_support_org",
          "scheduler": "schedule.yaml",
          "cron": "10 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:10",
          "command": "python3 -m backend.scripts.import_moj_registered_support_org_reps --download --apply",
          "modules": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:10:00+09:00",
              "beijing": "2026-11-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:10:00+09:00",
              "beijing": "2026-12-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:10:00+09:00",
              "beijing": "2027-01-08T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 764,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "molink_company_profiles",
      "crawler": "backend/scripts/import_molink_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "molink_company_profiles",
          "enabled": true,
          "line": 848
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 332,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "木材SCM支援システム もりんく 事業者詳細",
      "source_url": "https://molink.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://molink.jp/search",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "BASE_PROFILE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "profile_url_template",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 280,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "molink_company_profiles",
          "line": 848,
          "module_chain": [
            "backend.scripts.import_molink_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "molink_company_profiles",
          "scheduler": "schedule.yaml",
          "cron": "30 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:30",
          "command": "python3 -m backend.scripts.import_molink_representatives --start-id 1 --end-id 3000 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_molink_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:30:00+09:00",
              "beijing": "2026-11-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:30:00+09:00",
              "beijing": "2026-12-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:30:00+09:00",
              "beijing": "2027-01-09T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 848,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "molink_company_profiles",
      "crawler": "backend/scripts/import_molink_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "molink_company_profiles",
          "enabled": true,
          "line": 848
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 308,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.80, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "木材SCM支援システム もりんく 事業者詳細",
      "source_url": "https://molink.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://molink.jp/search",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "BASE_PROFILE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "profile_url_template",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 280,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "molink_company_profiles",
          "line": 848,
          "module_chain": [
            "backend.scripts.import_molink_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "molink_company_profiles",
          "scheduler": "schedule.yaml",
          "cron": "30 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:30",
          "command": "python3 -m backend.scripts.import_molink_representatives --start-id 1 --end-id 3000 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_molink_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:30:00+09:00",
              "beijing": "2026-11-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:30:00+09:00",
              "beijing": "2026-12-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:30:00+09:00",
              "beijing": "2027-01-09T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 848,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 674,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 562,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications\n                  (corporate_number, cert_name, authority, certified_at, scope,\n                   source_id, raw_doc_id, fetched_at, meta)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb)\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "なでしこ銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nagano_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_nagano_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 312,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'nagano_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'treatment_method', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHIN"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "長野県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nagano_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_nagano_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 292,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.76, 'active', 'public',\n                jsonb_build_object(\n                  'nagano_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "長野県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nexco_east_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_east_qualified_suppliers",
          "enabled": true,
          "line": 866
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 346,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO東日本 有資格者情報検索",
      "source_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
      "crawler_url_candidates": [
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 372,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_east_qualified_suppliers",
          "line": 866,
          "module_chain": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_east_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:30",
          "command": "python3 -m backend.scripts.import_nexco_east_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:30:00+09:00",
              "beijing": "2026-11-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:30:00+09:00",
              "beijing": "2026-12-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:30:00+09:00",
              "beijing": "2027-01-09T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 866,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nexco_east_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_east_qualified_suppliers",
          "enabled": true,
          "line": 866
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 326,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(\n                  'nexco_east_corp', %s::text,\n                  'source', 'nexco_east_qualified_supplier_search'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO東日本 有資格者情報検索",
      "source_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
      "crawler_url_candidates": [
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 372,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_east_qualified_suppliers",
          "line": 866,
          "module_chain": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_east_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:30",
          "command": "python3 -m backend.scripts.import_nexco_east_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:30:00+09:00",
              "beijing": "2026-11-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:30:00+09:00",
              "beijing": "2026-12-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:30:00+09:00",
              "beijing": "2027-01-09T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 866,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nexco_west_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_west_qualified_suppliers",
          "enabled": true,
          "line": 872
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 299,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO西日本 有資格者名簿",
      "source_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
      "crawler_url_candidates": [
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 325,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nexco_west_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_west_qualified_suppliers",
          "enabled": true,
          "line": 872
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 279,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.68, 'active', 'show_public',\n                jsonb_build_object(\n                  'nexco_west_corp', %s::text,\n                  'source', 'nexco_west_qualified_supplier_lists'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO西日本 有資格者名簿",
      "source_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
      "crawler_url_candidates": [
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 325,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 307,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                                INSERT INTO professionals (\n                                    profession_type, registration_no,\n                                    display_name, search_name, name_kana,\n                                    bar_association,\n                                    office_name, office_corporate_number,\n                                    office_address,\n                                    registered_at, status,\n                                    source_id, source_url, fetched_at, meta\n                                ) VALUES (\n                                    %s, %s, %s, %s, NULL, %s,\n                                    %s, NULL, %s,\n                                    NULL, %s,\n                                    %s, %s, %s, %s::jsonb\n                                )\n                                ON CONFLICT (profession_type, registration_no)\n                                DO UPDATE SET\n                                    display_name = EXCLUDED.dis"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "niigata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_niigata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'niigata_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "新潟県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "niigata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_niigata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 297,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'niigata_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "新潟県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 665,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications (\n                  corporate_number, cert_name, authority, certified_at, expires_at,\n                  scope, source_id, raw_doc_id, fetched_at, meta\n                ) VALUES (\n                  NULL, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb\n                )\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "nintei_shien_kikan_records",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "nintei_shien_kikan_records",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 612,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO nintei_shien_kikan_records (\n                  source_id, record_id, nintei_support_id, certification_no,\n                  certified_at, expires_at, name, store_name, prefecture, city,\n                  address, institution_type, financial_institution_type, head_branch,\n                  phone, fax, email, web_url, available_hours, pr_text,\n                  consultable_topics, support_menu, supported_industries,\n                  regional_platforms, special_notes, support_counts, detail_url,\n                  search_meta, detail_meta, raw_text, fetched_at\n                ) VALUES (\n                  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n                  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n                  %s::jsonb, %s, %s::jsonb, %s::jsonb, %s, now()\n                )\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 328,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nite_jiko",
          "enabled": true,
          "line": 154
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NITE 製品事故情報",
      "source_url": "https://www.nite.go.jp/jiko/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nite.go.jp/jiko/jikojohou/information/index.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.nite.go.jp",
          "symbol": "DATA_BASE",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 69,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nite_jiko",
          "line": 154,
          "module_chain": [
            "backend.crawlers.sources.nite_jiko"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2386,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定暴力団一覧",
      "source_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2464,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定重要指名手配",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/npo.py",
          "line": 154,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO business_licenses (\n                                corporate_number, license_type, license_no, authority,\n                                source_id, raw_doc_id, fetched_at, meta\n                            ) VALUES (%s, 'NPO法人', NULL, '内閣府', %s, NULL, %s, %s::jsonb)\n                            ON CONFLICT (dedup_key) DO NOTHING\n                        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "npo_facilities",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "npo_facilities",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 232,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO npo_facilities (\n    name, corporate_number, prefecture, city, address,\n    purpose, activity_areas, established_at,\n    phone, fax, homepage, email, employees, business_desc,\n    fiscal_year, revenue_total, expense_total, net_income,\n    bs_date, assets_total, liab_total, net_assets_total,\n    source_id, raw_doc_id, fetched_at, meta\n) VALUES (\n    %(name)s, %(corporate_number)s, %(prefecture)s, %(city)s, %(address)s,\n    %(purpose)s, %(activity_areas)s, %(established_at)s,\n    %(phone)s, %(fax)s, %(homepage)s, %(email)s, %(employees)s, %(business_desc)s,\n    %(fiscal_year)s, %(revenue_total)s, %(expense_total)s, %(net_income)s,\n    %(bs_date)s, %(assets_total)s, %(liab_total)s, %(net_assets_total)s,\n    %(source_id)s, %(raw_doc_id)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (name, source_id) DO UPDATE SET\n    corporate_number = COALESCE(EXCLUDED.corporate_number, npo_facilities.corporate_number),\n    phone           = COALESCE(EXCLUDED.phone, npo_facilities.phone),\n "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/scripts/import_npo_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 31,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 240,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_build_object(\n                  'via', 'npo_portal_bulk_csv',\n                  'raw_name', %s::text,\n                  'source_url', %s::text\n                ),\n                'npo_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/gyousei_000.zip",
          "symbol": "DEFAULT_URL",
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 32,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/scripts/import_npo_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 31,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 224,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active',\n                jsonb_build_object('npo_corp', %s::text, 'source', 'npo_portal'),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/gyousei_000.zip",
          "symbol": "DEFAULT_URL",
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 32,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_houjin",
      "crawler": "backend/scripts/import_houjin_bangou.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_daily",
          "enabled": true,
          "line": 380
        },
        {
          "task": "nta_houjin_monthly",
          "enabled": true,
          "line": 386
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 459,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nUPDATE companies SET\n    status = 'closed',\n    closed_date = COALESCE(%s::date, closed_date),\n    close_cause = COALESCE(%s, close_cause),\n    successor_corporate_number = COALESCE(%s, successor_corporate_number),\n    last_updated_at = now()\nWHERE corporate_number = %s\n"
        },
        {
          "table": "companies",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 469,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nUPDATE companies SET\n    status = 'active',\n    closed_date = NULL,\n    close_cause = NULL,\n    last_updated_at = now()\nWHERE corporate_number = %s\n"
        },
        {
          "table": "companies",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 421,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO companies ("
        },
        {
          "table": "companies",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 228,
          "origin": "online",
          "kind": "sql_write",
          "sql": "COPY companies ("
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号公表サイト",
      "source_url": "https://www.houjin-bangou.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.houjin-bangou.nta.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/index.html",
          "symbol": "ZENKEN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/",
          "symbol": "SABUN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/index.html",
          "symbol": "SABUN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 70,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nta_houjin_daily",
          "line": 380,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        },
        {
          "task": "nta_houjin_monthly",
          "line": 386,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 19:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode daily",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T19:00:00+09:00",
              "beijing": "2026-11-03T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T19:00:00+09:00",
              "beijing": "2026-11-04T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T19:00:00+09:00",
              "beijing": "2026-11-05T18:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 380,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nta_houjin_monthly",
          "scheduler": "schedule.yaml",
          "cron": "0 18 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 18:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode monthly",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T18:00:00+09:00",
              "beijing": "2026-11-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T18:00:00+09:00",
              "beijing": "2026-12-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T18:00:00+09:00",
              "beijing": "2027-01-05T17:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 386,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_houjin",
      "crawler": "backend/scripts/import_houjin_bangou.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_daily",
          "enabled": true,
          "line": 380
        },
        {
          "task": "nta_houjin_monthly",
          "enabled": true,
          "line": 386
        }
      ],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 478,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_aliases (\n    corporate_number, alias, alias_type, source, active_to, fetched_at\n)\nSELECT c.corporate_number, c.name, 'former_name', %s, NULL, now()\n  FROM companies c\n WHERE c.corporate_number = %s\n   AND c.name IS NOT NULL\n   AND c.name IS DISTINCT FROM %s\n   AND NOT EXISTS (\n       SELECT 1\n         FROM company_aliases a\n        WHERE a.corporate_number = c.corporate_number\n          AND a.alias_type = 'former_name'\n          AND a.alias = c.name\n   )\n"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号公表サイト",
      "source_url": "https://www.houjin-bangou.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.houjin-bangou.nta.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/index.html",
          "symbol": "ZENKEN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/",
          "symbol": "SABUN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/index.html",
          "symbol": "SABUN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 70,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nta_houjin_daily",
          "line": 380,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        },
        {
          "task": "nta_houjin_monthly",
          "line": 386,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 19:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode daily",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T19:00:00+09:00",
              "beijing": "2026-11-03T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T19:00:00+09:00",
              "beijing": "2026-11-04T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T19:00:00+09:00",
              "beijing": "2026-11-05T18:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 380,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nta_houjin_monthly",
          "scheduler": "schedule.yaml",
          "cron": "0 18 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 18:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode monthly",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T18:00:00+09:00",
              "beijing": "2026-11-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T18:00:00+09:00",
              "beijing": "2026-12-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T18:00:00+09:00",
              "beijing": "2027-01-05T17:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 386,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/import_houjin_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 546,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_api_daily",
          "enabled": false,
          "line": 419
        }
      ],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 175,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE companies SET "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 19:30",
          "command": "python3 -m backend.scripts.import_houjin_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 419,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tyc-nta-daily.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 18:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.import_houjin_via_api --daily --rps 3",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:30:00+00:00",
              "beijing": "2026-11-04T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:30:00+00:00",
              "beijing": "2026-11-05T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:30:00+00:00",
              "beijing": "2026-11-06T02:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-nta-daily.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 18:30:00 UTC ; next_elapse=Tue 2026-11-03 18:30:00 UTC }\nNextElapseUSecRealtime=Tue 2026-11-03 18:30:00 UTC\nLastTriggerUSec=Mon 2026-11-02 18:30:01 UTC\nId=tyc-nta-daily.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/import_houjin_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 546,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_api_daily",
          "enabled": false,
          "line": 419
        }
      ],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_aliases (\n    corporate_number, alias, alias_type, source, active_from, active_to, fetched_at\n)\nSELECT c.corporate_number, c.name, 'former_name', %s, NULL, %s, now()\n  FROM companies c\n WHERE c.corporate_number = %s\n   AND c.name IS NOT NULL\n   AND c.name IS DISTINCT FROM %s\n   AND NOT EXISTS (\n       SELECT 1\n         FROM company_aliases a\n        WHERE a.corporate_number = c.corporate_number\n          AND a.alias_type = 'former_name'\n          AND a.alias = c.name\n   )\n"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 19:30",
          "command": "python3 -m backend.scripts.import_houjin_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 419,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tyc-nta-daily.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 18:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.import_houjin_via_api --daily --rps 3",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:30:00+00:00",
              "beijing": "2026-11-04T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:30:00+00:00",
              "beijing": "2026-11-05T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:30:00+00:00",
              "beijing": "2026-11-06T02:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-nta-daily.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 18:30:00 UTC ; next_elapse=Tue 2026-11-03 18:30:00 UTC }\nNextElapseUSecRealtime=Tue 2026-11-03 18:30:00 UTC\nLastTriggerUSec=Mon 2026-11-02 18:30:01 UTC\nId=tyc-nta-daily.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/nta_history_backfill.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 292,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE companies SET last_updated_at = now() WHERE corporate_number = ANY(%s)"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/nta_history_backfill.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "company_aliases",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_aliases",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_aliases (\n    corporate_number, alias, alias_type, source, active_from, active_to, fetched_at\n)\nSELECT\n    %(corporate_number)s, %(alias)s, %(alias_type)s, %(source)s,\n    %(active_from)s, %(active_to)s, now()\nWHERE NOT EXISTS (\n    SELECT 1\n      FROM company_aliases\n     WHERE corporate_number = %(corporate_number)s\n       AND alias_type = %(alias_type)s\n       AND source = %(source)s\n       AND alias = %(alias)s\n)\n"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/nta_history_backfill.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "company_changes",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_changes",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 234,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_changes ("
        }
      ],
      "dimensions": [
        7
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 201,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国税庁 公示・刑事告発",
      "source_url": "https://www.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 683,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC 50%ルール 間接保有 (派生)",
      "source_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 49,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC SDN List",
      "source_url": "https://www.treasury.gov/ofac/downloads/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "osaka_city_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_city_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 388,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, '代表者', %s, now(),\n           jsonb_build_object(\n             'via', 'osaka_city_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'license_category', %s::text,\n             'treatment_method', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, positio"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_city_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_city_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 361,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'osaka_city_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_medical_corporation_reports",
      "crawler": "backend/scripts/import_osaka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 864,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'report_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府医療法人事業報告書等",
      "source_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_medical_corporation_reports",
      "crawler": "backend/scripts/import_osaka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 841,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府医療法人事業報告書等",
      "source_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 455,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'osaka_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'trade_name', %s::text,\n             'db_company_name', %s::text,\n             'postal_code', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'license_type', %s::text,\n             'issue_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'excellent_certification', %s::text,\n             'info_url', %s::text,\n             'match_reason', %s::t"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 428,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'osaka_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 561,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO professionals (\n                                profession_type, registration_no,\n                                display_name, search_name, name_kana,\n                                bar_association,\n                                office_name, office_corporate_number,\n                                office_address,\n                                registered_at, status,\n                                source_id, source_url, fetched_at, meta\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, NULL, %s, %s, %s,\n                                %s, %s, %s, %s::jsonb\n                            )\n                            ON CONFLICT (profession_type, registration_no)\n                            DO UPDATE SET\n                                display_name = EXCLUDED.display_name,\n                                search_name = EXCLUDED.search_name,\n                                name_kana = EXCLUDED.name"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 363,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 428,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "partnership_declaration",
          "enabled": true,
          "line": 539
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 343,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at, expires_at,\n               scope, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, NULL, %s, %s, %s, now(), %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "パートナーシップ構築宣言",
      "source_url": "https://www.biz-partnership.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/declaration/",
          "symbol": "PDF_BASE",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 111,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 499,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "partnership_declaration",
          "line": 539,
          "module_chain": [
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps",
          "line": 722,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "line": 728,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pmark_jmra",
      "crawler": "backend/scripts/import_jmra_pmark_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmark_jmra",
          "enabled": true,
          "line": 800
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 278,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'cert_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "JMRA プライバシーマーク付与適格決定事業者一覧",
      "source_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmark_jmra",
          "line": 800,
          "module_chain": [
            "backend.scripts.import_jmra_pmark_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "pmark_jmra",
          "scheduler": "schedule.yaml",
          "cron": "10 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:10",
          "command": "python3 -m backend.scripts.import_jmra_pmark_representatives --apply",
          "modules": [
            "backend.scripts.import_jmra_pmark_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:10:00+09:00",
              "beijing": "2026-11-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:10:00+09:00",
              "beijing": "2026-12-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:10:00+09:00",
              "beijing": "2027-01-08T08:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 800,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pmark_jmra",
      "crawler": "backend/scripts/import_jmra_pmark_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmark_jmra",
          "enabled": true,
          "line": 800
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 259,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.66, 'active', 'show_public',\n                jsonb_build_object(\n                  'pmark_jmra_corp', %s::text,\n                  'source', 'jmra_pmark_public_list'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "JMRA プライバシーマーク付与適格決定事業者一覧",
      "source_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmark_jmra",
          "line": 800,
          "module_chain": [
            "backend.scripts.import_jmra_pmark_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "pmark_jmra",
          "scheduler": "schedule.yaml",
          "cron": "10 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:10",
          "command": "python3 -m backend.scripts.import_jmra_pmark_representatives --apply",
          "modules": [
            "backend.scripts.import_jmra_pmark_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:10:00+09:00",
              "beijing": "2026-11-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:10:00+09:00",
              "beijing": "2026-12-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:10:00+09:00",
              "beijing": "2027-01-08T08:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 800,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 138,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmda_recall",
          "enabled": true,
          "line": 148
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "PMDA 医薬品/医療機器 回収",
      "source_url": "https://www.info.pmda.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 150,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 244,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmda_recall",
          "line": 148,
          "module_chain": [
            "backend.crawlers.sources.pmda_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 130,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ppc_actions",
          "enabled": true,
          "line": 127
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "個人情報保護委員会 処分",
      "source_url": "https://www.ppc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ppc.go.jp/news/press/{dynamic}/",
          "symbol": "url",
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ppc_actions",
          "line": 127,
          "module_chain": [
            "backend.crawlers.sources.ppc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3192,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "FUKUOKA_BORYOKUDAN_EXCLUSION_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "fukuoka_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2513,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "都道府県警察 指名手配ページ",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 223,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 265,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "prtimes",
          "enabled": true,
          "line": 38
        }
      ],
      "table": "news_mentions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "news_mentions",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO news_mentions\n          (corporate_number, match_confidence, title, summary, url,\n           publisher, published_at, source_id, raw_doc_id, fetched_at)\n        VALUES (%s, %s, %s, %s, %s, 'PR TIMES', %s, %s, %s, now())\n        ON CONFLICT (title, url, corporate_number, source_id, published_at) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "PR TIMES プレスリリース",
      "source_url": "https://prtimes.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://prtimes.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://prtimes.jp/sitemap-news.xml",
          "symbol": "SITEMAP_NEWS",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "prtimes",
          "line": 38,
          "module_chain": [
            "backend.crawlers.sources.prtimes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2928,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公安調査庁 国際テロリズム要覧",
      "source_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
          "symbol": "PSIA_TERROR_ORGS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "real_estate_appraisers",
      "crawler": "backend/crawlers/sources/real_estate_appraisers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 69,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "real_estate_appraisers",
          "enabled": true,
          "line": 1034
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 384,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO business_licenses\n              (corporate_number, license_type, license_no, authority,\n               issued_date, expires_date, status, source_id, fetched_at, meta)\n            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n            ON CONFLICT (dedup_key) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産鑑定業者名簿 (国交省)",
      "source_url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "real_estate_appraisers",
          "line": 1034,
          "module_chain": [
            "backend.crawlers.sources.real_estate_appraisers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "real_estate_appraisers",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.crawlers.sources.real_estate_appraisers",
          "modules": [
            "backend.crawlers.sources.real_estate_appraisers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1034,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "appraisal_reports",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "appraisal_reports",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 554,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO appraisal_reports (\n                                prefecture_code, city_code, area_name, use_category, serial_no,\n                                price_year, unit_price_jpy, published_price, yoy_change_pct,\n                                address_lot, address_disp, land_area_sqm, land_shape,\n                                front_road_width, front_road_type, zoning_use, zoning_fire,\n                                coverage_ratio, floor_area_ratio,\n                                nearest_station, station_dist_m, lon, lat,\n                                rosen_price, rosen_year,\n                                cost_method_price, income_method_price, market_method_price,\n                                raw_full, source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n           "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gis_facility_points",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gis_facility_points",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 1109,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO gis_facility_points (\n                                endpoint_code, facility_kind,\n                                facility_name, facility_type,\n                                administrative_code, prefecture_code, city_code,\n                                address, lon, lat, flags, extra,\n                                source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n                                %s::jsonb, %s::jsonb, %s, NOW()\n                            )\n                            ON CONFLICT (endpoint_code, facility_kind,\n                                         COALESCE(prefecture_code,''),\n                                         COALESCE(city_code,''),\n                                         COALESCE(facility_name,''),\n                                         COALESCE(lon::text,''),\n                                         COALESCE(lat::text,''))\n                            DO "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gis_zone_polygons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gis_zone_polygons",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 983,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO gis_zone_polygons (\n                                endpoint_code, zone_kind,\n                                prefecture_code, city_code, city_name,\n                                zone_label, zone_category,\n                                coverage_ratio, floor_area_ratio,\n                                decided_date, target_year, notice_number, plan_name,\n                                geometry_wkt,\n                                bbox_minlon, bbox_maxlon, bbox_minlat, bbox_maxlat,\n                                raw_props, source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s,\n                                %s, %s,\n                                %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s, %s, %s,\n                                %s::jsonb, %s, NOW()\n                            )\n                            ON CONFLICT (endpoint_code, prefecture_code,\n       "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "land_prices",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "land_prices",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 791,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO land_prices (\n                                point_id, land_price_type, target_year,\n                                prefecture_code, prefecture, city_code, city, ward,\n                                place_name, location, standard_lot_no, use_category,\n                                current_price, last_year_price, yoy_change_pct,\n                                area_sqm, building_year, structure,\n                                building_coverage_ratio, floor_area_ratio,\n                                fireproof_zone, zone_category,\n                                nearest_station, station_distance_m, usage_status,\n                                geometry_lon, geometry_lat,\n                                source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s,\n                                %s, %s, %s,\n           "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "municipalities_lookup",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "municipalities_lookup",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 496,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO municipalities_lookup\n                                   (code, prefecture_code, name, fetched_at)\n                               VALUES (%s, %s, %s, NOW())\n                               ON CONFLICT (code) DO UPDATE\n                                   SET name = EXCLUDED.name, fetched_at = NOW()"
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "population_mesh_250m",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "population_mesh_250m",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 1189,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO population_mesh_250m (\n                                mesh_id, prefecture_code,\n                                pop_2025, pop_2030, pop_2040, pop_2050, pop_2060, pop_2070,\n                                elderly_ratio_2025, elderly_ratio_2050, elderly_ratio_2070,\n                                geometry_wkt, raw_props, source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, %s,\n                                %s, %s, %s,\n                                %s, %s::jsonb, %s, NOW()\n                            )\n                            ON CONFLICT (mesh_id) DO UPDATE SET\n                                pop_2025 = EXCLUDED.pop_2025,\n                                pop_2050 = EXCLUDED.pop_2050,\n                                raw_props = EXCLUDED.raw_props,\n                                fetched_at = NOW()\n                            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "real_estate_transactions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "real_estate_transactions",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 410,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO real_estate_transactions (\n                                transaction_no, property_type,\n                                prefecture_code, prefecture, city_code, city, district,\n                                station, area_sqm, building_year, structure,\n                                use_purpose, price_jpy, price_per_sqm,\n                                transaction_year, transaction_quarter,\n                                source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s,\n                                %s, %s,\n                                %s, NOW()\n                            )\n                            ON CONFLICT (transaction_year, transaction_quarter,\n                                         prefecture_code, city_code,\n                                         COALESCE(district, ''),\n                    "
        },
        {
          "table": "real_estate_transactions",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 691,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO real_estate_transactions (\n                                transaction_no, property_type,\n                                prefecture_code, prefecture, city_code, city, district,\n                                station, area_sqm, building_year, structure,\n                                use_purpose, price_jpy, price_per_sqm,\n                                transaction_year, transaction_quarter,\n                                source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s,\n                                %s, %s,\n                                %s, NOW()\n                            )\n                            ON CONFLICT (transaction_year, transaction_quarter,\n                                         prefecture_code, city_code,\n                                         COALESCE(district, ''),\n                    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "station_passengers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "station_passengers",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 1267,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO station_passengers (\n                                station_code, station_name, company_name, line_name,\n                                prefecture_code,\n                                passengers_2018, passengers_2019, passengers_2020,\n                                passengers_2021, passengers_2022, passengers_2023,\n                                geometry_wkt, raw_props, source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s, %s, %s,\n                                %s, %s::jsonb, %s, NOW()\n                            )\n                            ON CONFLICT (COALESCE(station_code,''),\n                                         COALESCE(station_name,''),\n                                         COALESCE(company_name,''))\n                            DO UPDATE SET\n                                passengers_2023 = EXCLUDED.passengers_2023,\n                                "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "kind": "database_field_lineage",
          "column": "geometry_wkt"
        }
      ],
      "jobs": [],
      "table": "zoning_areas",
      "status": "declared_lineage",
      "table_evidence": [
        {
          "kind": "database_field_lineage",
          "column": "geometry_wkt",
          "parser_module": "backend.crawlers.sources.reinfolib"
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "appraisal_reports",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "appraisal_reports",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 554,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "INSERT INTO appraisal_reports (\n                                prefecture_code, city_code, area_name, use_category, serial_no,\n                                price_year, unit_price_jpy, published_price, yoy_change_pct,\n                                address_lot, address_disp, land_area_sqm, land_shape,\n                                front_road_width, front_road_type, zoning_use, zoning_fire,\n                                coverage_ratio, floor_area_ratio,\n                                nearest_station, station_dist_m, lon, lat,\n                                rosen_price, rosen_year,\n                                cost_method_price, income_method_price, market_method_price,\n                                raw_full, source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n           "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "real_estate_transactions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "real_estate_transactions",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 410,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "INSERT INTO real_estate_transactions (\n                                transaction_no, property_type,\n                                prefecture_code, prefecture, city_code, city, district,\n                                station, area_sqm, building_year, structure,\n                                use_purpose, price_jpy, price_per_sqm,\n                                transaction_year, transaction_quarter,\n                                source_id, fetched_at\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s,\n                                %s, %s, %s, %s,\n                                %s, %s, %s,\n                                %s, %s,\n                                %s, NOW()\n                            )\n                            ON CONFLICT (transaction_year, transaction_quarter,\n                                         prefecture_code, city_code,\n                                         COALESCE(district, ''),\n                    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "saitama_medical_corporation_reports",
      "crawler": "backend/scripts/import_saitama_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "saitama_medical_corporation_reports",
          "enabled": true,
          "line": 908
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 572,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'report_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "埼玉県医療法人決算届",
      "source_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "saitama_medical_corporation_reports",
          "line": 908,
          "module_chain": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "saitama_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "0 7 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 07:00",
          "command": "python3 -m backend.scripts.import_saitama_medical_corporation_reps --max-zips 30 --max-pdfs 600 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T07:00:00+09:00",
              "beijing": "2027-01-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T07:00:00+09:00",
              "beijing": "2027-04-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T07:00:00+09:00",
              "beijing": "2027-07-10T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 908,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "saitama_medical_corporation_reports",
      "crawler": "backend/scripts/import_saitama_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "saitama_medical_corporation_reports",
          "enabled": true,
          "line": 908
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 549,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.76, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "埼玉県医療法人決算届",
      "source_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "saitama_medical_corporation_reports",
          "line": 908,
          "module_chain": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "saitama_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "0 7 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 07:00",
          "command": "python3 -m backend.scripts.import_saitama_medical_corporation_reps --max-zips 30 --max-pdfs 600 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T07:00:00+09:00",
              "beijing": "2027-01-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T07:00:00+09:00",
              "beijing": "2027-04-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T07:00:00+09:00",
              "beijing": "2027-07-10T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 908,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sakai_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_sakai_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 372,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, '代表者', %s, now(),\n           jsonb_build_object(\n             'via', 'sakai_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'ward', %s::text,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'treatment_method', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "堺市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "sakai_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_sakai_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 345,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'sakai_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "堺市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 404,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                            INSERT INTO professionals (\n                                profession_type, registration_no,\n                                display_name, search_name, name_kana,\n                                bar_association,\n                                office_name, office_corporate_number, office_address,\n                                registered_at, status,\n                                source_id, source_url, fetched_at, meta\n                            ) VALUES (\n                                %s, %s, %s, %s, %s, %s, %s, NULL, %s, %s, %s,\n                                %s, %s, %s, %s::jsonb\n                            )\n                            ON CONFLICT (profession_type, registration_no)\n                            DO UPDATE SET\n                                display_name = EXCLUDED.display_name,\n                                search_name = EXCLUDED.search_name,\n                                name_kana = EXCLUDED.name_kana,\n                         "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 483,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sbt_certified",
          "enabled": true,
          "line": 575
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 443,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at,\n               scope, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SBT (Science Based Targets) 認定企業 — 日本",
      "source_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "crawler_url_candidates": [
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "COMPANIES_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "TARGETS_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 510,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 516,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sbt_certified",
          "line": 575,
          "module_chain": [
            "backend.crawlers.sources.sbt_certified"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 272,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "school_institution",
          "enabled": true,
          "line": 606
        }
      ],
      "table": "school_institution",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "school_institution",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 230,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO school_institution (\n              school_code, school_type, school_type_code, establishment_type,\n              name, prefecture, prefecture_code, city, address, postal_code,\n              established_at, abolished_at, branch_type, legacy_code, successor_code,\n              source_id, raw_doc_id, fetched_at, meta\n            ) VALUES (\n              %(school_code)s, %(school_type)s, %(school_type_code)s, %(establishment_type)s,\n              %(name)s, %(prefecture)s, %(prefecture_code)s, %(city)s, %(address)s, %(postal_code)s,\n              %(established_at)s, %(abolished_at)s, %(branch_type)s, %(legacy_code)s, %(successor_code)s,\n              %(source_id)s, %(raw_doc_id)s, now(), '{}'::jsonb\n            )\n            ON CONFLICT (school_code) DO UPDATE SET\n              school_type=EXCLUDED.school_type,\n              school_type_code=EXCLUDED.school_type_code,\n              establishment_type=EXCLUDED.establishment_type,\n              name=EXCLUDED.name,\n   "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "source_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
          "symbol": "BASE_PAGE",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "school_institution",
          "line": 606,
          "module_chain": [
            "backend.crawlers.sources.school_institution"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "twice_yearly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 58,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sec_20f",
          "enabled": true,
          "line": 569
        }
      ],
      "table": "cross_listings",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "cross_listings",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 266,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO cross_listings (\n            corporate_number, exchange, cik, ticker, name_en, name_ja,\n            latest_filing_date, latest_form, source_id, raw_doc_id, fetched_at, meta\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n        ON CONFLICT (exchange, cik) DO UPDATE SET\n            corporate_number   = COALESCE(EXCLUDED.corporate_number, cross_listings.corporate_number),\n            ticker             = EXCLUDED.ticker,\n            name_en            = EXCLUDED.name_en,\n            name_ja            = COALESCE(EXCLUDED.name_ja, cross_listings.name_ja),\n            latest_filing_date = GREATEST(EXCLUDED.latest_filing_date, cross_listings.latest_filing_date),\n            latest_form        = EXCLUDED.latest_form,\n            raw_doc_id         = COALESCE(EXCLUDED.raw_doc_id, cross_listings.raw_doc_id),\n            fetched_at         = now(),\n            meta               = cross_listings.meta || EXCLUDED.meta\n        RETURNING (xmax = 0)"
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "source_url": "https://www.sec.gov/",
      "crawler_url_candidates": [
        {
          "url": "https://efts.sec.gov/LATEST/search-index",
          "symbol": "EFTS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://data.sec.gov/submissions/CIK{cik10}.json",
          "symbol": "SUBMISSIONS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sec_20f",
          "line": 569,
          "module_chain": [
            "backend.crawlers.sources.sec_20f"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 407,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SEC 会計監査関連処分（AAER）",
      "source_url": "https://www.sec.gov/divisions/enforce/friactions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 445,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "security_companies",
          "enabled": true,
          "line": 1026
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 413,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO business_licenses\n              (corporate_number, license_type, license_no, authority,\n               issued_date, expires_date, status, source_id, raw_doc_id,\n               fetched_at, meta)\n            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n            ON CONFLICT (dedup_key) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "source_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "security_companies",
          "line": 1026,
          "module_chain": [
            "backend.crawlers.sources.security_companies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 624,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seiji_shikin",
          "enabled": true,
          "line": 521
        }
      ],
      "table": "political_organization_reports",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "political_organization_reports",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 343,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO political_organization_reports (\n    org_name, org_kind, party, report_kind, fiscal_year, published_on,\n    prefecture, report_id, index_url, pdf_urls,\n    source_id, raw_doc_id, fetched_at, meta\n) VALUES (\n    %(org_name)s, %(org_kind)s, %(party)s, %(report_kind)s, %(fiscal_year)s, %(published_on)s,\n    %(prefecture)s, %(report_id)s, %(index_url)s, %(pdf_urls)s::jsonb,\n    %(source_id)s, %(raw_doc_id)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (report_id) DO UPDATE SET\n    org_name     = EXCLUDED.org_name,\n    org_kind     = EXCLUDED.org_kind,\n    party        = EXCLUDED.party,\n    report_kind  = EXCLUDED.report_kind,\n    fiscal_year  = COALESCE(EXCLUDED.fiscal_year, political_organization_reports.fiscal_year),\n    published_on = EXCLUDED.published_on,\n    prefecture   = COALESCE(EXCLUDED.prefecture, political_organization_reports.prefecture),\n    index_url    = EXCLUDED.index_url,\n    pdf_urls     = EXCLUDED.pdf_urls,\n    fetched_at   = EXCLUDED.fetched_at,\n    meta"
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 84,
          "origin": "online"
        },
        {
          "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 85,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seiji_shikin",
          "line": 521,
          "module_chain": [
            "backend.crawlers.sources.seiji_shikin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin_donors.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 329,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "political_donations",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "political_donations",
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 249,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO political_donations (\n                    report_id_ref, donor_name, donor_kind, donor_address,\n                    recipient_political_group, recipient_party,\n                    donation_kind, amount_yen, donation_date, fiscal_year,\n                    pdf_url, pdf_page, raw_text,\n                    extraction_method, match_confidence,\n                    source_id, fetched_at, parser_version, meta\n                )\n                VALUES (\n                    %(report_id_ref)s, %(donor_name)s, %(donor_kind)s, %(donor_address)s,\n                    %(recipient_political_group)s, %(recipient_party)s,\n                    %(donation_kind)s, %(amount_yen)s, %(donation_date)s, %(fiscal_year)s,\n                    %(pdf_url)s, %(pdf_page)s, %(raw_text)s,\n                    %(extraction_method)s, %(match_confidence)s,\n                    %(source_id)s, %(fetched_at)s, %(parser_version)s, '{}'::jsonb\n                )\n            "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin_donors.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 329,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "political_organization_reports",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "political_organization_reports",
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 321,
          "origin": "online",
          "kind": "sql_write",
          "sql": "UPDATE political_organization_reports SET donations_parsed=true WHERE id=%s"
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 150,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sesc_actions",
          "enabled": true,
          "line": 931
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "証券取引等監視委員会 課徴金事例",
      "source_url": "https://www.fsa.go.jp/sesc/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 160,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 220,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sesc_actions",
          "line": 931,
          "module_chain": [
            "backend.crawlers.sources.sesc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shihoshoshi",
          "enabled": true,
          "line": 437
        }
      ],
      "table": "professionals",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "professionals",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 323,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO professionals (\n    profession_type, registration_no, display_name, search_name, name_kana,\n    bar_association, office_name, office_address, registered_at, status,\n    source_id, source_url, fetched_at, meta\n) VALUES (\n    %(profession_type)s, %(registration_no)s, %(display_name)s, %(search_name)s, %(name_kana)s,\n    %(bar_association)s, %(office_name)s, %(office_address)s, %(registered_at)s, 'active',\n    %(source_id)s, %(source_url)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (profession_type, registration_no) DO UPDATE SET\n    display_name    = EXCLUDED.display_name,\n    search_name     = EXCLUDED.search_name,\n    name_kana       = EXCLUDED.name_kana,\n    bar_association = EXCLUDED.bar_association,\n    office_name     = EXCLUDED.office_name,\n    office_address  = EXCLUDED.office_address,\n    source_url      = EXCLUDED.source_url,\n    fetched_at      = EXCLUDED.fetched_at,\n    meta            = EXCLUDED.meta\nRETURNING id, (xmax = 0) AS inserted\n"
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "司法書士検索",
      "source_url": "https://www.shiho-shoshi.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shiho-shoshi.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 97,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 98,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 375,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shihoshoshi",
          "line": 437,
          "module_chain": [
            "backend.crawlers.sources.shihoshoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3422,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "静岡県公安委員会 暴力団排除条例 公表結果",
      "source_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "SHIZUOKA_BORYOKUDAN_PUBLIC_NOTICE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "index_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3502,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 513,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shokuhin_eisei",
          "enabled": true,
          "line": 371
        }
      ],
      "table": "food_business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "food_business_licenses",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 365,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO food_business_licenses\n    (corporate_number, kyoka_no, kyoka_type, prefecture, city,\n     name, address, legal_name, granted_at, expires_at,\n     source_id, raw_doc_id, fetched_at, meta)\nVALUES\n    (%s, %s, %s, %s, %s,\n     %s, %s, %s, %s, %s,\n     %s, %s, %s, %s::jsonb)\nON CONFLICT (kyoka_no, prefecture, city, name) DO UPDATE SET\n    corporate_number = COALESCE(EXCLUDED.corporate_number, food_business_licenses.corporate_number),\n    kyoka_type = COALESCE(EXCLUDED.kyoka_type, food_business_licenses.kyoka_type),\n    name        = EXCLUDED.name,\n    address     = COALESCE(EXCLUDED.address, food_business_licenses.address),\n    legal_name  = COALESCE(EXCLUDED.legal_name, food_business_licenses.legal_name),\n    granted_at  = COALESCE(EXCLUDED.granted_at, food_business_licenses.granted_at),\n    expires_at  = COALESCE(EXCLUDED.expires_at, food_business_licenses.expires_at),\n    fetched_at  = EXCLUDED.fetched_at,\n    raw_doc_id  = EXCLUDED.raw_doc_id,\n    meta        = EXCLUDED.m"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "食品衛生申請等システム (食品営業許可・届出)",
      "source_url": "https://i2fas.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN_SEARCH",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shokuhin_eisei",
          "line": 371,
          "module_chain": [
            "backend.crawlers.sources.shokuhin_eisei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 355,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 371,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shougai_fukushi",
          "enabled": true,
          "line": 563
        }
      ],
      "table": "disability_welfare_facilities",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "disability_welfare_facilities",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 306,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO disability_welfare_facilities\n              (corporate_number, service_type, service_code, prefecture, city,\n               facility_code, name, name_kana, company_name, company_name_kana,\n               address, phone, fax, url, capacity, designation_authority,\n               source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n                    %s, %s, %s, %s, %s, %s, %s, %s, now(), %s::jsonb)\n            ON CONFLICT (facility_code, service_type) DO UPDATE\n              SET corporate_number = EXCLUDED.corporate_number,\n                  prefecture       = EXCLUDED.prefecture,\n                  city             = EXCLUDED.city,\n                  name             = EXCLUDED.name,\n                  name_kana        = EXCLUDED.name_kana,\n                  company_name     = EXCLUDED.company_name,\n                  company_name_kana = EXCLUDED.company_name_kana,\n                  address          = EXCLUDED.address"
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "source_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 82,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 83,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/files/pcpub/top/sfkopendata/{period}/sfkopendata_{period}_{svc}.zip",
          "symbol": "ZIP_URL_TMPL",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 84,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shougai_fukushi",
          "line": 563,
          "module_chain": [
            "backend.crawlers.sources.shougai_fukushi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "semiannual"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 351,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO certifications (\n                  corporate_number, cert_name, authority, certified_at, expires_at,\n                  scope, source_id, raw_doc_id, fetched_at, meta\n\t                ) VALUES (\n\t                  CASE\n\t                    WHEN %s::char(13) IS NOT NULL\n\t                     AND EXISTS (SELECT 1 FROM companies WHERE corporate_number=%s::char(13))\n\t                    THEN %s::char(13) ELSE NULL END,\n\t                  %s, %s, NULL, NULL, %s, %s, %s, now(), %s::jsonb\n\t                )\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "smart_sme_supporters",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "smart_sme_supporters",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 305,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO smart_sme_supporters (\n                  source_id, supporter_id, corporate_number, name, name_kana,\n                  postal_code, prefecture, city, address_line, address_full,\n                  target_industries, support_result_industries,\n                  support_company_count_range, support_employee_count_range,\n                  has_effect_tracking, security_answers, riss_count,\n                  third_party_certification_status, third_party_certification_detail,\n                  phone, phone_hours, email, web_url, services, detail_url,\n                  raw_text, fetched_at, meta\n                ) VALUES (\n                  %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n                  %s, %s::jsonb, %s, %s, %s, %s, %s, %s, %s, %s::jsonb,\n                  %s, %s, now(), %s::jsonb\n                )\n                "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sme_ma_support_institution",
      "crawler": "backend/scripts/import_sme_ma_support_institution_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 318,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "中小企業庁 M&A支援機関登録制度 登録支援機関データベース",
      "source_url": "https://ma-shienkikan.go.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/livewire/message/frontend.published-card",
          "symbol": "LIVEWIRE_ENDPOINT",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "source_url",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 380,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "sme_ma_support_institution",
      "crawler": "backend/scripts/import_sme_ma_support_institution_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 299,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.74, 'active', 'show_public',\n                jsonb_build_object(\n                  'sme_ma_support_institution_corp', %s::text,\n                  'source', 'sme_ma_support_institution_registry'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "中小企業庁 M&A支援機関登録制度 登録支援機関データベース",
      "source_url": "https://ma-shienkikan.go.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/livewire/message/frontend.published-card",
          "symbol": "LIVEWIRE_ENDPOINT",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "source_url",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 380,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "soumu_registered_telecom",
      "crawler": "backend/scripts/import_soumu_registered_telecom_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 33,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "soumu_registered_telecom",
          "enabled": true,
          "line": 776
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 279,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "総務省 登録電気通信事業者一覧",
      "source_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "soumu_registered_telecom",
          "line": 776,
          "module_chain": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "soumu_registered_telecom",
          "scheduler": "schedule.yaml",
          "cron": "10 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:10",
          "command": "python3 -m backend.scripts.import_soumu_registered_telecom_reps --apply",
          "modules": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:10:00+09:00",
              "beijing": "2026-11-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:10:00+09:00",
              "beijing": "2026-12-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:10:00+09:00",
              "beijing": "2027-01-08T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 776,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "soumu_registered_telecom",
      "crawler": "backend/scripts/import_soumu_registered_telecom_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 33,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "soumu_registered_telecom",
          "enabled": true,
          "line": 776
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 260,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.74, 'active', 'show_public',\n                jsonb_build_object(\n                  'soumu_registered_telecom_corp', %s::text,\n                  'source', 'soumu_registered_telecom_list'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "総務省 登録電気通信事業者一覧",
      "source_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "soumu_registered_telecom",
          "line": 776,
          "module_chain": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "soumu_registered_telecom",
          "scheduler": "schedule.yaml",
          "cron": "10 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:10",
          "command": "python3 -m backend.scripts.import_soumu_registered_telecom_reps --apply",
          "modules": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:10:00+09:00",
              "beijing": "2026-11-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:10:00+09:00",
              "beijing": "2026-12-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:10:00+09:00",
              "beijing": "2027-01-08T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 776,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_members",
      "crawler": "backend/scripts/import_t2fifa_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "t2fifa_members",
          "enabled": true,
          "line": 806
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 342,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "第二種金融商品取引業協会 正会員名簿",
      "source_url": "https://www.t2fifa.or.jp/members/register/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 177,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "source_url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 186,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "t2fifa_members",
          "line": 806,
          "module_chain": [
            "backend.scripts.import_t2fifa_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "t2fifa_members",
          "scheduler": "schedule.yaml",
          "cron": "40 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:40",
          "command": "python3 -m backend.scripts.import_t2fifa_member_representatives --max-pages 80 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_t2fifa_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:40:00+09:00",
              "beijing": "2026-11-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:40:00+09:00",
              "beijing": "2026-12-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:40:00+09:00",
              "beijing": "2027-01-08T08:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 806,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_members",
      "crawler": "backend/scripts/import_t2fifa_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "t2fifa_members",
          "enabled": true,
          "line": 806
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 326,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "第二種金融商品取引業協会 正会員名簿",
      "source_url": "https://www.t2fifa.or.jp/members/register/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 177,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "source_url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 186,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "t2fifa_members",
          "line": 806,
          "module_chain": [
            "backend.scripts.import_t2fifa_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "t2fifa_members",
          "scheduler": "schedule.yaml",
          "cron": "40 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:40",
          "command": "python3 -m backend.scripts.import_t2fifa_member_representatives --max-pages 80 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_t2fifa_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:40:00+09:00",
              "beijing": "2026-11-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:40:00+09:00",
              "beijing": "2026-12-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:40:00+09:00",
              "beijing": "2027-01-08T08:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 806,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "takatsuki_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_takatsuki_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 467,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'takatsuki_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'treatment_method', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOT"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "高槻市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "takatsuki_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_takatsuki_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 440,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'takatsuki_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "高槻市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "takken_registry",
      "crawler": "backend/crawlers/sources/takken_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "takken_registry",
          "enabled": true,
          "line": 449
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 283,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO business_licenses\n                  (corporate_number, license_type, license_no, authority,\n                   issued_date, expires_date, status, source_id, fetched_at, meta)\n                VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n                ON CONFLICT (dedup_key) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "建設業者・宅建業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/sokatsuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "takken_registry",
          "line": 449,
          "module_chain": [
            "backend.crawlers.sources.takken_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "takken_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 11:00",
          "command": "python3 -m backend.crawlers.sources.takken_registry",
          "modules": [
            "backend.crawlers.sources.takken_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T11:00:00+09:00",
              "beijing": "2026-11-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T11:00:00+09:00",
              "beijing": "2026-12-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T11:00:00+09:00",
              "beijing": "2027-01-07T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 449,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tcfd_supporters",
          "enabled": true,
          "line": 488
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 355,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO certifications\n              (corporate_number, cert_name, authority, certified_at, expires_at,\n               scope, source_id, raw_doc_id, fetched_at, meta)\n            VALUES (%s, %s, %s, %s, NULL, %s, %s, %s, %s, %s::jsonb)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TCFD賛同企業・機関 (経産省)",
      "source_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "URL",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 349,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tcfd_supporters",
          "line": 488,
          "module_chain": [
            "backend.crawlers.sources.tcfd_supporters"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "news_mentions",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "news_mentions",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO news_mentions (\n                corporate_number, match_confidence, title, url, publisher,\n                published_at, topic, source_id, raw_doc_id, fetched_at\n            ) VALUES (\n                %(corporate_number)s, %(match_confidence)s, %(title)s, %(url)s, %(publisher)s,\n                %(published_at)s, %(topic)s, %(source_id)s, %(raw_doc_id)s, %(fetched_at)s\n            )\n            ON CONFLICT (title, url, corporate_number, source_id, published_at) DO NOTHING\n            RETURNING id\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "temp_staffing_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 107,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 440,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO business_licenses\n              (corporate_number, license_type, license_no, authority,\n               issued_date, expires_date, status, source_id, fetched_at, meta)\n            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s::jsonb)\n            ON CONFLICT (dedup_key) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "労働者派遣事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tochigi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tochigi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 399,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'tochigi_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'jurisdiction', %s::text,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'business_type', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_n"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "栃木県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tochigi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tochigi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 372,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'tochigi_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "栃木県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tokyo_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tokyo_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 413,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都 産業廃棄物処理業者情報検索",
      "source_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
      "crawler_url_candidates": [
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_itiran.aspx",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "source_url",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 442,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tokyo_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tokyo_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 392,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'show_public',\n                jsonb_build_object(\n                  'tokyo_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'permit_number', %s::text,\n                  'source', 'tokyo_sanpai_waste_licensee_search'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都 産業廃棄物処理業者情報検索",
      "source_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
      "crawler_url_candidates": [
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_itiran.aspx",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "source_url",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 442,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tokyo_taishin_architect",
      "crawler": "backend/scripts/import_tokyo_taishin_architect_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tokyo_taishin_architect",
          "enabled": true,
          "line": 896
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 361,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都木造住宅耐震診断事務所登録名簿",
      "source_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
      "crawler_url_candidates": [
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/renew/assets/pdf/office_list_1.pdf",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 391,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tokyo_taishin_architect",
          "line": 896,
          "module_chain": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "tokyo_taishin_architect",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:00",
          "command": "python3 -m backend.scripts.import_tokyo_taishin_architect_reps --apply",
          "modules": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:00:00+09:00",
              "beijing": "2027-01-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:00:00+09:00",
              "beijing": "2027-04-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:00:00+09:00",
              "beijing": "2027-07-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 896,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tokyo_taishin_architect",
      "crawler": "backend/scripts/import_tokyo_taishin_architect_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tokyo_taishin_architect",
          "enabled": true,
          "line": 896
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 345,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.70, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都木造住宅耐震診断事務所登録名簿",
      "source_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
      "crawler_url_candidates": [
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/renew/assets/pdf/office_list_1.pdf",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 391,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tokyo_taishin_architect",
          "line": 896,
          "module_chain": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "tokyo_taishin_architect",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:00",
          "command": "python3 -m backend.scripts.import_tokyo_taishin_architect_reps --apply",
          "modules": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:00:00+09:00",
              "beijing": "2027-01-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:00:00+09:00",
              "beijing": "2027-04-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:00:00+09:00",
              "beijing": "2027-07-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 896,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tosankyo_members",
      "crawler": "backend/scripts/import_tosankyo_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 318,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都産業資源循環協会 正会員名簿",
      "source_url": "https://tosankyo.or.jp/regular_member",
      "crawler_url_candidates": [
        {
          "url": "https://tosankyo.or.jp/regular_member",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tosankyo_members",
      "crawler": "backend/scripts/import_tosankyo_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 297,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.68, 'active', 'show_public',\n                jsonb_build_object(\n                  'tosankyo_member_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'member_no', %s::text,\n                  'source', 'tosankyo_member_list'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都産業資源循環協会 正会員名簿",
      "source_url": "https://tosankyo.or.jp/regular_member",
      "crawler_url_candidates": [
        {
          "url": "https://tosankyo.or.jp/regular_member",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "toyama_sanpai_association_members",
      "crawler": "backend/scripts/import_toyama_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 290,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, '代表者', %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県産業資源循環協会 処理業許可業者名簿",
      "source_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
      "crawler_url_candidates": [
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "source_url",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyama_sanpai_association_members",
      "crawler": "backend/scripts/import_toyama_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 270,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.68, 'active', 'show_public',\n                jsonb_build_object(\n                  'toyama_sanpai_association_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source', 'toyama_sanpai_association_disposal_companies'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県産業資源循環協会 処理業許可業者名簿",
      "source_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
      "crawler_url_candidates": [
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "source_url",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyama_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyama_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 315,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'toyama_sanpai_waste_licensee_excel',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyama_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyama_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 295,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'toyama_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyonaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyonaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 399,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'toyonaka_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'page_number', %s::int,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'office_address', %s::text,\n             'facility_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'permit_date', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'treatment_method', %s::text,\n             'match_reason', %s::text\n           ),\n           'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTH"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "豊中市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyonaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyonaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 372,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'toyonaka_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'office_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "豊中市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "travel_agencies",
          "enabled": true,
          "line": 1018
        }
      ],
      "table": "business_licenses",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "business_licenses",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 534,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO business_licenses (\n    corporate_number, license_type, license_no, authority,\n    issued_date, expires_date, status,\n    source_id, raw_doc_id, fetched_at, meta\n) VALUES (\n    %(corporate_number)s, %(license_type)s, %(license_no)s, %(authority)s,\n    %(issued_date)s, NULL, 'active',\n    %(source_id)s, %(raw_doc_id)s, %(fetched_at)s, %(meta)s::jsonb\n)\nON CONFLICT (dedup_key) DO UPDATE SET\n    corporate_number = COALESCE(EXCLUDED.corporate_number, business_licenses.corporate_number),\n    authority        = EXCLUDED.authority,\n    issued_date      = COALESCE(EXCLUDED.issued_date, business_licenses.issued_date),\n    fetched_at       = EXCLUDED.fetched_at,\n    meta             = business_licenses.meta || EXCLUDED.meta\nRETURNING id, (xmax = 0) AS inserted\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "source_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/index.html",
          "symbol": "KANKOCHO_PAGE",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 77,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "travel_agencies",
          "line": 1018,
          "module_chain": [
            "backend.crawlers.sources.travel_agencies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1093,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "英国 FCA 行政処分",
      "source_url": "https://www.fca.org.uk/news/enforcement",
      "crawler_url_candidates": [
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "HMT UK Sanctions",
      "source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "UN Sanctions List",
      "source_url": "https://www.un.org/securitycouncil/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "university_portrait_private_school",
      "crawler": "backend/scripts/import_university_portrait_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "university_portrait_private_school",
          "enabled": true,
          "line": 884
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 418,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'directory_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大学ポートレート（私学版）法人情報",
      "source_url": "https://up-j.shigaku.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 555,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "sitemap_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 556,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "university_portrait_private_school",
          "line": 884,
          "module_chain": [
            "backend.scripts.import_university_portrait_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "university_portrait_private_school",
          "scheduler": "schedule.yaml",
          "cron": "0 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:00",
          "command": "python3 -m backend.scripts.import_university_portrait_representatives --sleep 0.08 --apply",
          "modules": [
            "backend.scripts.import_university_portrait_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:00:00+09:00",
              "beijing": "2027-01-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:00:00+09:00",
              "beijing": "2027-04-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:00:00+09:00",
              "beijing": "2027-07-10T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 884,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "university_portrait_private_school",
      "crawler": "backend/scripts/import_university_portrait_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "university_portrait_private_school",
          "enabled": true,
          "line": 884
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 400,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.82, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大学ポートレート（私学版）法人情報",
      "source_url": "https://up-j.shigaku.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 555,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "sitemap_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 556,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "university_portrait_private_school",
          "line": 884,
          "module_chain": [
            "backend.scripts.import_university_portrait_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "university_portrait_private_school",
          "scheduler": "schedule.yaml",
          "cron": "0 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:00",
          "command": "python3 -m backend.scripts.import_university_portrait_representatives --sleep 0.08 --apply",
          "modules": [
            "backend.scripts.import_university_portrait_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:00:00+09:00",
              "beijing": "2027-01-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:00:00+09:00",
              "beijing": "2027-04-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:00:00+09:00",
              "beijing": "2027-07-10T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 884,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ur_qualified_suppliers",
      "crawler": "backend/scripts/import_ur_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ur_qualified_suppliers",
          "enabled": true,
          "line": 860
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 283,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "UR都市機構 有資格者名簿",
      "source_url": "https://www.ur-net.go.jp/order/procedure.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 299,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ur_qualified_suppliers",
          "line": 860,
          "module_chain": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "ur_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:00",
          "command": "python3 -m backend.scripts.import_ur_qualified_supplier_reps --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:00:00+09:00",
              "beijing": "2026-11-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:00:00+09:00",
              "beijing": "2026-12-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:00:00+09:00",
              "beijing": "2027-01-09T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 860,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ur_qualified_suppliers",
      "crawler": "backend/scripts/import_ur_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ur_qualified_suppliers",
          "enabled": true,
          "line": 860
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 264,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'show_public',\n                jsonb_build_object(\n                  'ur_qualified_supplier_corp', %s::text,\n                  'source', 'ur_qualified_supplier_public_pdf'\n                ),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "UR都市機構 有資格者名簿",
      "source_url": "https://www.ur-net.go.jp/order/procedure.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 299,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ur_qualified_suppliers",
          "line": 860,
          "module_chain": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "ur_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:00",
          "command": "python3 -m backend.scripts.import_ur_qualified_supplier_reps --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:00:00+09:00",
              "beijing": "2026-11-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:00:00+09:00",
              "beijing": "2026-12-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:00:00+09:00",
              "beijing": "2027-01-09T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 860,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "virtual_office_operators",
      "crawler": "backend/crawlers/sources/virtual_office_operators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1042,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "virtual_office_operators",
          "enabled": true,
          "line": 1042
        }
      ],
      "table": "virtual_office_locations",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "virtual_office_locations",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 547,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO virtual_office_locations\n    (operator, location_name, raw_address, postal_code, prefecture, city,\n     street_number, building, url, fetched_at)\nVALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, now())\nON CONFLICT (operator, location_name) DO UPDATE\n    SET raw_address = EXCLUDED.raw_address,\n        postal_code = EXCLUDED.postal_code,\n        prefecture = EXCLUDED.prefecture,\n        city = EXCLUDED.city,\n        street_number = EXCLUDED.street_number,\n        building = EXCLUDED.building,\n        url = EXCLUDED.url,\n        fetched_at = now()\n"
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "日本主要虚拟办公室运营商一覧",
      "source_url": "https://www.regus.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.regus-office.jp/sitemap.xml",
          "symbol": "REGUS_SITEMAP_URL",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 233,
          "origin": "online"
        },
        {
          "url": "https://www.regus-office.jp",
          "symbol": "REGUS_BASE",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 234,
          "origin": "online"
        },
        {
          "url": "https://www.servcorp.co.jp/sitemap.xml",
          "symbol": "SERVCORP_SITEMAP_URL",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 372,
          "origin": "online"
        },
        {
          "url": "https://crosscoop.com/",
          "symbol": "CROSSCOOP_HOME_URL",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 468,
          "origin": "online"
        },
        {
          "url": "https://crosscoop.com",
          "symbol": "CROSSCOOP_BASE",
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 469,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "virtual_office_operators",
          "line": 1042,
          "module_chain": [
            "backend.crawlers.sources.virtual_office_operators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "virtual_office_operators",
          "scheduler": "schedule.yaml",
          "cron": "30 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:30",
          "command": "python3 -m backend.crawlers.sources.virtual_office_operators --operator all",
          "modules": [
            "backend.crawlers.sources.virtual_office_operators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:30:00+09:00",
              "beijing": "2026-11-04T08:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:30:00+09:00",
              "beijing": "2026-11-11T08:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:30:00+09:00",
              "beijing": "2026-11-18T08:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1042,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 432,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 414,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "wam_social_welfare_current_report",
      "crawler": "backend/scripts/import_wam_social_welfare_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wam_social_welfare_current_report",
          "enabled": true,
          "line": 854
        }
      ],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 341,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'report_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM NET 社会福祉法人 現況報告書",
      "source_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "TOP_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0216000E01.do",
          "symbol": "CORP_NO_SEARCH_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 365,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wam_social_welfare_current_report",
          "line": 854,
          "module_chain": [
            "backend.scripts.import_wam_social_welfare_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "wam_social_welfare_current_report",
          "scheduler": "schedule.yaml",
          "cron": "0 7 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 07:00",
          "command": "python3 -m backend.scripts.import_wam_social_welfare_reps --limit 10000 --sleep 0.2 --apply",
          "modules": [
            "backend.scripts.import_wam_social_welfare_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T07:00:00+09:00",
              "beijing": "2026-12-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T07:00:00+09:00",
              "beijing": "2027-01-09T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 854,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wam_social_welfare_current_report",
      "crawler": "backend/scripts/import_wam_social_welfare_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wam_social_welfare_current_report",
          "enabled": true,
          "line": 854
        }
      ],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 325,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.82, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM NET 社会福祉法人 現況報告書",
      "source_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "TOP_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0216000E01.do",
          "symbol": "CORP_NO_SEARCH_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 365,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wam_social_welfare_current_report",
          "line": 854,
          "module_chain": [
            "backend.scripts.import_wam_social_welfare_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "wam_social_welfare_current_report",
          "scheduler": "schedule.yaml",
          "cron": "0 7 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 07:00",
          "command": "python3 -m backend.scripts.import_wam_social_welfare_reps --limit 10000 --sleep 0.2 --apply",
          "modules": [
            "backend.scripts.import_wam_social_welfare_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T07:00:00+09:00",
              "beijing": "2026-12-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T07:00:00+09:00",
              "beijing": "2027-01-09T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 854,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 395,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 499,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wikidata_houjin",
          "enabled": true,
          "line": 527
        }
      ],
      "table": "company_wikidata",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_wikidata",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 283,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO company_wikidata (\n  corporate_number, wikidata_qid, item_label_ja, description_ja,\n  founders_ja, inception_date, hq_location_ja, official_site_url,\n  wikipedia_ja_url, wikipedia_extract, attribution,\n  raw_doc_id, fetched_at, parser_version, meta, updated_at\n) VALUES (\n  %(corporate_number)s, %(wikidata_qid)s, %(item_label_ja)s, %(description_ja)s,\n  %(founders_ja)s, %(inception_date)s, %(hq_location_ja)s, %(official_site_url)s,\n  %(wikipedia_ja_url)s, %(wikipedia_extract)s, %(attribution)s,\n  %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s, %(meta)s::jsonb, now()\n)\nON CONFLICT (corporate_number) DO UPDATE SET\n  wikidata_qid      = EXCLUDED.wikidata_qid,\n  item_label_ja     = EXCLUDED.item_label_ja,\n  description_ja    = EXCLUDED.description_ja,\n  founders_ja       = EXCLUDED.founders_ja,\n  inception_date    = EXCLUDED.inception_date,\n  hq_location_ja    = EXCLUDED.hq_location_ja,\n  official_site_url = EXCLUDED.official_site_url,\n  wikipedia_ja_url  = EXCLUDED.wikiped"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "Wikidata 法人番号 LOD",
      "source_url": "https://query.wikidata.org/sparql",
      "crawler_url_candidates": [
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "SPARQL_URL",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "sparql_endpoint",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wikidata_houjin",
          "line": 527,
          "module_chain": [
            "backend.crawlers.sources.wikidata_houjin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 732,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "yakkyoku_registry",
          "enabled": true,
          "line": 467
        }
      ],
      "table": "pharmacy_registry",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "pharmacy_registry",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 426,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO pharmacy_registry\n    (corporate_number, license_no, name, name_kana, address,\n     prefecture, city, phone, opened_at, expires_at,\n     services, operator_name, operator_address, is_corporate,\n     latitude, longitude, source_id, raw_doc_id, fetched_at, meta)\nVALUES\n    (%s, %s, %s, %s, %s,\n     %s, %s, %s, %s, %s,\n     %s, %s, %s, %s,\n     %s, %s, %s, %s, %s, %s::jsonb)\nON CONFLICT (license_no, prefecture, city, name) DO UPDATE SET\n    corporate_number = COALESCE(EXCLUDED.corporate_number, pharmacy_registry.corporate_number),\n    name_kana        = COALESCE(EXCLUDED.name_kana, pharmacy_registry.name_kana),\n    address          = COALESCE(EXCLUDED.address, pharmacy_registry.address),\n    phone            = COALESCE(EXCLUDED.phone, pharmacy_registry.phone),\n    opened_at        = COALESCE(EXCLUDED.opened_at, pharmacy_registry.opened_at),\n    expires_at       = COALESCE(EXCLUDED.expires_at, pharmacy_registry.expires_at),\n    services         = COALESCE(EXCLUDED.services, ph"
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "source_url": "https://data.bodik.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "yakkyoku_registry",
          "line": 467,
          "module_chain": [
            "backend.crawlers.sources.yakkyoku_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2760,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暴力団ニュース～ヤクザ事件簿",
      "source_url": "https://www.yakuza-news.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza-news.jp/",
          "symbol": "YAKUZA_NEWS_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 76,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/posts",
          "symbol": "YAKUZA_NEWS_POSTS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/categories",
          "symbol": "YAKUZA_NEWS_CATEGORIES_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/tags",
          "symbol": "YAKUZA_NEWS_TAGS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2671,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1000,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE risk_events\n               SET effective_to = %s::date - INTERVAL '1 day'\n             WHERE source_id = %s\n               AND subcategory = 'npa_designated_boryokudan_org'\n               AND event_date < %s::date\n               AND effective_to IS NULL\n            "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "YAKUZA WIKI 民間暴力団情報",
      "source_url": "https://www.yakuza.wiki/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 74,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_LIST_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 75,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yamagata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamagata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 398,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'yamagata_sanpai_waste_licensee_excel_zip',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'sheet_name', %s::text,\n             'row_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'permit_number', %s::text,\n             'expiry_date', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山形県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "yamagata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamagata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 371,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'yamagata_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山形県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "yamanashi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamanashi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 366,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES\n          (%s, %s, %s, %s, now(),\n           jsonb_build_object(\n             'via', 'yamanashi_sanpai_waste_licensee_pdf',\n             'source_kind', %s::text,\n             'source_url', %s::text,\n             'source_file', %s::text,\n             'block_number', %s::int,\n             'source_company_name', %s::text,\n             'db_company_name', %s::text,\n             'source_address', %s::text,\n             'db_address', %s::text,\n             'postal_code', %s::text,\n             'permit_number', %s::text,\n             'phone', %s::text,\n             'match_reason', %s::text\n           ),\n           'representative')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山梨県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "yamanashi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamanashi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 346,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active', 'public',\n                jsonb_build_object(\n                  'yamanashi_sanpai_corp', %s::text,\n                  'source_company_name', %s::text,\n                  'source_address', %s::text,\n                  'permit_number', %s::text\n                ))\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山梨県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 92,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "youth_yell",
          "enabled": true,
          "line": 551
        }
      ],
      "table": "certifications",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "certifications",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 368,
          "origin": "online",
          "kind": "reviewed_dynamic_table_selection",
          "sql": ""
        }
      ],
      "dimensions": [
        9,
        10
      ],
      "source_name": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "source_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/ninteilist.action",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 405,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {
        "9": "meta.recruit_url（招聘链接；不是完整职位库）"
      },
      "enabled_schedule_paths": [
        {
          "task": "youth_yell",
          "line": 551,
          "module_chain": [
            "backend.crawlers.sources.youth_yell"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 204,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士情報検索",
      "source_url": "https://www.zeirishikensaku.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 194,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 197,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士懲戒処分公告",
      "source_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "risk_events",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 281,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
        },
        {
          "table": "risk_events",
          "file": "backend/crawlers/storage.py",
          "line": 299,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_public_legal_pages",
      "crawler": "backend/scripts/crawl_website_responsible_person_clues.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 52,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "public_representative_clues",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "public_representative_clues",
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 648,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO public_representative_clues (\n                corporate_number, company_name, raw_representative, display_name,\n                position, name_parse_status, evidence_kind, evidence_scope,\n                confidence, source_id, source_table, source_row_id, source_url,\n                observed_at, fetched_at, extraction_method, meta\n            ) VALUES (\n                %s, %s, %s, %s,\n                %s, %s, %s, %s,\n                %s, %s, %s, %s, %s,\n                %s, %s, %s, %s\n            )\n            ON CONFLICT (source_id, source_table, source_row_id, corporate_number, raw_representative)\n            DO UPDATE SET\n                company_name = EXCLUDED.company_name,\n                display_name = EXCLUDED.display_name,\n                position = EXCLUDED.position,\n                name_parse_status = EXCLUDED.name_parse_status,\n                evidence_kind = EXCLUDED.evidence_kind,\n                evidence_scope = EXCLUDED.evidence_scope,\n             "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公式サイト公開開示ページ",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/backfill_officers_from_website.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 242,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id, fetched_at, meta,\n           role_tier)\n        VALUES (%s, %s, %s, %s, COALESCE(%s::timestamptz, now()),\n                jsonb_build_object('via', 'company_website_data',\n                                   'source_url', %s::text),\n                'website_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公式サイト会社概要",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/backfill_officers_from_website.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 224,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.55, 'active',\n                jsonb_build_object('website_rep_corp', %s::text,\n                                   'source', 'company_website_data'),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公式サイト会社概要",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_en_name_from_edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 188,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "companies",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "companies",
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 176,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nUPDATE companies\n   SET en_name = %s,\n       en_name_source = 'edinet_xbrl',\n       last_updated_at = NOW()\n WHERE corporate_number = %s\n   AND (en_name IS NULL OR en_name = '')\n"
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "geps",
      "crawler": "backend/scripts/backfill_geps_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 395,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(),\n                jsonb_build_object(\n                  'via', 'geps_public_business_detail',\n                  'raw_name', %s::text,\n                  'source_url', %s::text,\n                  'company_name', %s::text\n                ),\n                'geps_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.p-portal.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0101",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0100",
          "symbol": "SEARCH_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0108",
          "symbol": "DETAIL_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BID_ZIP_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "geps",
      "crawler": "backend/scripts/backfill_geps_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 379,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.72, 'active',\n                jsonb_build_object('geps_corp', %s::text, 'source', 'geps_public_business_detail'),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.p-portal.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0101",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0100",
          "symbol": "SEARCH_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0108",
          "symbol": "DETAIL_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BID_ZIP_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/scripts/import_jetro_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 234,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s::jsonb, 'jetro_case_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ジェトロ活用事例",
      "source_url": "https://www.jetro.go.jp/case_study/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/scripts/import_jetro_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 208,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.66, 'active', 'show_public',\n                %s::jsonb,\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ジェトロ活用事例",
      "source_url": "https://www.jetro.go.jp/case_study/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "medical_info_net_pharmacy",
      "crawler": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "officers",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "officers",
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 554,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO officers\n          (corporate_number, person_id, position, source_id,\n           fetched_at, meta, role_tier)\n        VALUES (%s, %s, %s, %s, now(), %s, 'license_rep')\n        ON CONFLICT (corporate_number, person_id, position) DO NOTHING\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "厚生労働省 医療情報ネット 薬局詳細",
      "source_url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
      "crawler_url_candidates": [
        {
          "url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "medical_info_net_pharmacy",
      "crawler": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "persons",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "persons",
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 536,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO persons\n          (display_name, search_name, resolution_method, resolution_confidence,\n           status, display_policy, meta, created_at)\n        VALUES (%s, %s, 'unmerged', 0.78, 'active', 'show_public',\n                jsonb_build_object(%s::text, %s::text, 'source', %s::text),\n                now())\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "厚生労働省 医療情報ネット 薬局詳細",
      "source_url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
      "crawler_url_candidates": [
        {
          "url": "https://www.iryou.teikyouseido.mhlw.go.jp/znk-web/juminkanja/S2430/initialize",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    }
  ],
  "support_relationships": [
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 732,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "yakkyoku_registry",
          "enabled": true,
          "line": 467
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "source_url": "https://data.bodik.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "yakkyoku_registry",
          "line": 467,
          "module_chain": [
            "backend.crawlers.sources.yakkyoku_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 732,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "yakkyoku_registry",
          "enabled": true,
          "line": 467
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "source_url": "https://data.bodik.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "yakkyoku_registry",
          "line": 467,
          "module_chain": [
            "backend.crawlers.sources.yakkyoku_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/crawlers/sources/env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 118,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "env_sanpai",
          "enabled": true,
          "line": 139
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www2.sanpainet.or.jp/sanpai/search_list.php",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "env_sanpai",
          "line": 139,
          "module_chain": [
            "backend.crawlers.sources.env_sanpai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "env_sanpai",
          "scheduler": "schedule.yaml",
          "cron": "50 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:50",
          "command": "python3 -m backend.crawlers.sources.env_sanpai",
          "modules": [
            "backend.crawlers.sources.env_sanpai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:50:00+09:00",
              "beijing": "2026-11-04T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:50:00+09:00",
              "beijing": "2026-11-05T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:50:00+09:00",
              "beijing": "2026-11-06T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 139,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 47,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 47,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "crypto_exchange_fsa",
          "enabled": true,
          "line": 545
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暗号資産交換業者一覧 (取扱資産含む)",
      "source_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
          "symbol": "PDF_URL",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "crypto_exchange_fsa",
          "line": 545,
          "module_chain": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "crypto_exchange_fsa",
          "enabled": true,
          "line": 545
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暗号資産交換業者一覧 (取扱資産含む)",
      "source_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
          "symbol": "PDF_URL",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "crypto_exchange_fsa",
          "line": 545,
          "module_chain": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_business_purpose.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 258,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_business_purpose",
          "enabled": true,
          "line": 1177
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 58,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sec_20f",
          "enabled": true,
          "line": 569
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "source_url": "https://www.sec.gov/",
      "crawler_url_candidates": [
        {
          "url": "https://efts.sec.gov/LATEST/search-index",
          "symbol": "EFTS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://data.sec.gov/submissions/CIK{cik10}.json",
          "symbol": "SUBMISSIONS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sec_20f",
          "line": 569,
          "module_chain": [
            "backend.crawlers.sources.sec_20f"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 58,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sec_20f",
          "enabled": true,
          "line": 569
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "source_url": "https://www.sec.gov/",
      "crawler_url_candidates": [
        {
          "url": "https://efts.sec.gov/LATEST/search-index",
          "symbol": "EFTS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://data.sec.gov/submissions/CIK{cik10}.json",
          "symbol": "SUBMISSIONS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sec_20f",
          "line": 569,
          "module_chain": [
            "backend.crawlers.sources.sec_20f"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 272,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "school_institution",
          "enabled": true,
          "line": 606
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "source_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
          "symbol": "BASE_PAGE",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "school_institution",
          "line": 606,
          "module_chain": [
            "backend.crawlers.sources.school_institution"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "twice_yearly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 272,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "school_institution",
          "enabled": true,
          "line": 606
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "source_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
          "symbol": "BASE_PAGE",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "school_institution",
          "line": 606,
          "module_chain": [
            "backend.crawlers.sources.school_institution"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "twice_yearly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 395,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 499,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wikidata_houjin",
          "enabled": true,
          "line": 527
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "Wikidata 法人番号 LOD",
      "source_url": "https://query.wikidata.org/sparql",
      "crawler_url_candidates": [
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "SPARQL_URL",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "sparql_endpoint",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wikidata_houjin",
          "line": 527,
          "module_chain": [
            "backend.crawlers.sources.wikidata_houjin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 395,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 499,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wikidata_houjin",
          "enabled": true,
          "line": 527
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "Wikidata 法人番号 LOD",
      "source_url": "https://query.wikidata.org/sparql",
      "crawler_url_candidates": [
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "SPARQL_URL",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "sparql_endpoint",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wikidata_houjin",
          "line": 527,
          "module_chain": [
            "backend.crawlers.sources.wikidata_houjin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "temp_staffing_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 107,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "労働者派遣事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "job_placement_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 115,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "有料職業紹介事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 43,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暗号資産交換業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 43,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暗号資産交換業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 48,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "登録貸金業者検索",
      "source_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 48,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "登録貸金業者検索",
      "source_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 53,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融商品取引業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 53,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融商品取引業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "travel_agencies",
          "enabled": true,
          "line": 1018
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "source_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/index.html",
          "symbol": "KANKOCHO_PAGE",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 77,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "travel_agencies",
          "line": 1018,
          "module_chain": [
            "backend.crawlers.sources.travel_agencies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "travel_agencies",
          "enabled": true,
          "line": 1018
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "source_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/index.html",
          "symbol": "KANKOCHO_PAGE",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 77,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "travel_agencies",
          "line": 1018,
          "module_chain": [
            "backend.crawlers.sources.travel_agencies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 513,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shokuhin_eisei",
          "enabled": true,
          "line": 371
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "食品衛生申請等システム (食品営業許可・届出)",
      "source_url": "https://i2fas.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN_SEARCH",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shokuhin_eisei",
          "line": 371,
          "module_chain": [
            "backend.crawlers.sources.shokuhin_eisei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 513,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shokuhin_eisei",
          "enabled": true,
          "line": 371
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "食品衛生申請等システム (食品営業許可・届出)",
      "source_url": "https://i2fas.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN_SEARCH",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shokuhin_eisei",
          "line": 371,
          "module_chain": [
            "backend.crawlers.sources.shokuhin_eisei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 56,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "daigaku_hatsu_vc",
          "enabled": true,
          "line": 500
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大学発ベンチャーデータベース",
      "source_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 54,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
          "symbol": "HUB_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 55,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "daigaku_hatsu_vc",
          "line": 500,
          "module_chain": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 56,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "daigaku_hatsu_vc",
          "enabled": true,
          "line": 500
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大学発ベンチャーデータベース",
      "source_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 54,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
          "symbol": "HUB_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 55,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "daigaku_hatsu_vc",
          "line": 500,
          "module_chain": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "real_estate_appraisers",
      "crawler": "backend/crawlers/sources/real_estate_appraisers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 69,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "real_estate_appraisers",
          "enabled": true,
          "line": 1034
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産鑑定業者名簿 (国交省)",
      "source_url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "real_estate_appraisers",
          "line": 1034,
          "module_chain": [
            "backend.crawlers.sources.real_estate_appraisers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "real_estate_appraisers",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.crawlers.sources.real_estate_appraisers",
          "modules": [
            "backend.crawlers.sources.real_estate_appraisers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1034,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 582,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_xbrl",
          "enabled": true,
          "line": 66
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 582,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_xbrl",
          "enabled": true,
          "line": 66
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 92,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "youth_yell",
          "enabled": true,
          "line": 551
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "source_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/ninteilist.action",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 405,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "youth_yell",
          "line": 551,
          "module_chain": [
            "backend.crawlers.sources.youth_yell"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 92,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "youth_yell",
          "enabled": true,
          "line": 551
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "source_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/ninteilist.action",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 405,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "youth_yell",
          "line": 551,
          "module_chain": [
            "backend.crawlers.sources.youth_yell"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 225,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 230,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "dx_nintei",
          "enabled": true,
          "line": 533
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "DX認定事業者 (IPA / 経産省)",
      "source_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "crawler_url_candidates": [
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "CSV_URL",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/details",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 154,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 251,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "dx_nintei",
          "line": 533,
          "module_chain": [
            "backend.crawlers.sources.dx_nintei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 225,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 230,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "dx_nintei",
          "enabled": true,
          "line": 533
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "DX認定事業者 (IPA / 経産省)",
      "source_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "crawler_url_candidates": [
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "CSV_URL",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/details",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 154,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 251,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "dx_nintei",
          "line": 533,
          "module_chain": [
            "backend.crawlers.sources.dx_nintei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 156,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_filings",
          "enabled": true,
          "line": 60
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "enabled": true,
          "line": 324
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2/documents.json",
          "symbol": "API",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_filings",
          "line": 60,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "line": 324,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 156,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_filings",
          "enabled": true,
          "line": 60
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "enabled": true,
          "line": 324
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2/documents.json",
          "symbol": "API",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_filings",
          "line": 60,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "line": 324,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 355,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 371,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shougai_fukushi",
          "enabled": true,
          "line": 563
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "source_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 82,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 83,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/files/pcpub/top/sfkopendata/{period}/sfkopendata_{period}_{svc}.zip",
          "symbol": "ZIP_URL_TMPL",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 84,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shougai_fukushi",
          "line": 563,
          "module_chain": [
            "backend.crawlers.sources.shougai_fukushi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "semiannual"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 355,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 371,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shougai_fukushi",
          "enabled": true,
          "line": 563
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "source_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 82,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 83,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/files/pcpub/top/sfkopendata/{period}/sfkopendata_{period}_{svc}.zip",
          "symbol": "ZIP_URL_TMPL",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 84,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shougai_fukushi",
          "line": 563,
          "module_chain": [
            "backend.crawlers.sources.shougai_fukushi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "semiannual"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 283,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 296,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kenko_keiei",
          "enabled": true,
          "line": 482
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "健康経営優良法人認定 (経産省/日本健康会議)",
      "source_url": "https://kenko-keiei.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kenko-keiei.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://kenko-keiei.jp/houjin_list/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kenko_keiei",
          "line": 482,
          "module_chain": [
            "backend.crawlers.sources.kenko_keiei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 283,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 296,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kenko_keiei",
          "enabled": true,
          "line": 482
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "健康経営優良法人認定 (経産省/日本健康会議)",
      "source_url": "https://kenko-keiei.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kenko-keiei.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://kenko-keiei.jp/houjin_list/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kenko_keiei",
          "line": 482,
          "module_chain": [
            "backend.crawlers.sources.kenko_keiei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 82,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, name_en, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, '資源エネルギー庁 発電事業者一覧', 'ANRE Electricity Generators',\n                    'license', '資源エネルギー庁', %s, 'public_open', 'P1', true)\n            ON CONFLICT (code) DO UPDATE SET updated_at=now() RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 176,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jclp",
          "enabled": true,
          "line": 494
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "source_url": "https://japan-clp.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://japan-clp.jp/about/organization",
          "symbol": "URL",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 57,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jclp",
          "line": 494,
          "module_chain": [
            "backend.crawlers.sources.jclp"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 176,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jclp",
          "enabled": true,
          "line": 494
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "source_url": "https://japan-clp.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://japan-clp.jp/about/organization",
          "symbol": "URL",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 57,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jclp",
          "line": 494,
          "module_chain": [
            "backend.crawlers.sources.jclp"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 351,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 392,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "medical_facilities",
          "enabled": true,
          "line": 461
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "医療機能情報提供制度 全国オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CONTENT_BASE",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "medical_facilities",
          "line": 461,
          "module_chain": [
            "backend.crawlers.sources.medical_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 351,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 392,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "medical_facilities",
          "enabled": true,
          "line": 461
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "医療機能情報提供制度 全国オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CONTENT_BASE",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "medical_facilities",
          "line": 461,
          "module_chain": [
            "backend.crawlers.sources.medical_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "bid_notice_crawl_segments",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "bid_notice_crawl_segments",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 373,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO bid_notice_crawl_segments (\n            source_id, segment_key, lg_code, category, procedure_type,\n            period_start, period_end, status, search_hits, records_returned,\n            last_run_at, error_message, metrics, updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s,\n            now(), %s, %s::jsonb, now()\n        )\n        ON CONFLICT (source_id, segment_key) DO UPDATE SET\n            status = EXCLUDED.status,\n            search_hits = EXCLUDED.search_hits,\n            records_returned = EXCLUDED.records_returned,\n            last_run_at = EXCLUDED.last_run_at,\n            error_message = EXCLUDED.error_message,\n            metrics = bid_notice_crawl_segments.metrics || EXCLUDED.metrics,\n            updated_at = now()\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shihoshoshi",
          "enabled": true,
          "line": 437
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "司法書士検索",
      "source_url": "https://www.shiho-shoshi.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shiho-shoshi.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 97,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 98,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 375,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shihoshoshi",
          "line": 437,
          "module_chain": [
            "backend.crawlers.sources.shihoshoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shihoshoshi",
          "enabled": true,
          "line": 437
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "司法書士検索",
      "source_url": "https://www.shiho-shoshi.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shiho-shoshi.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 97,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 98,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 375,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shihoshoshi",
          "line": 437,
          "module_chain": [
            "backend.crawlers.sources.shihoshoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hojyokin_portal",
      "crawler": "backend/crawlers/sources/hojyokin_portal.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "enabled": false,
          "line": 689
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "enabled": false,
          "line": 696
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "enabled": true,
          "line": 703
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "enabled": true,
          "line": 709
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "補助金ポータル 補助金・助成金・支援金",
      "source_url": "https://hojyokin-portal.jp/subsidies/list",
      "crawler_url_candidates": [
        {
          "url": "https://hojyokin-portal.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://hojyokin-portal.jp/subsidies/list",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "line": 703,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "line": 709,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "scheduler": "schedule.yaml",
          "cron": "35 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 03:35",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --max-pages-per-pref 20 --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 689,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "weekly",
          "label": "每周一 03:40",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 696,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 04:10",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --include-ended --list-snapshot-only --sleep 1.0 --list-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 480,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T04:10:00+09:00",
              "beijing": "2026-11-10T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T04:10:00+09:00",
              "beijing": "2026-11-17T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T04:10:00+09:00",
              "beijing": "2026-11-24T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 703,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "scheduler": "schedule.yaml",
          "cron": "55 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:55",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --snapshot-detail-limit 500 --sleep 1.0 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:55:00+09:00",
              "beijing": "2026-11-04T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:55:00+09:00",
              "beijing": "2026-11-05T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:55:00+09:00",
              "beijing": "2026-11-06T03:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 709,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tcfd_supporters",
          "enabled": true,
          "line": 488
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TCFD賛同企業・機関 (経産省)",
      "source_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "URL",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 349,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tcfd_supporters",
          "line": 488,
          "module_chain": [
            "backend.crawlers.sources.tcfd_supporters"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tcfd_supporters",
          "enabled": true,
          "line": 488
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TCFD賛同企業・機関 (経産省)",
      "source_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "URL",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 349,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tcfd_supporters",
          "line": 488,
          "module_chain": [
            "backend.crawlers.sources.tcfd_supporters"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 624,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seiji_shikin",
          "enabled": true,
          "line": 521
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 84,
          "origin": "online"
        },
        {
          "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 85,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seiji_shikin",
          "line": 521,
          "module_chain": [
            "backend.crawlers.sources.seiji_shikin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 624,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seiji_shikin",
          "enabled": true,
          "line": 521
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 84,
          "origin": "online"
        },
        {
          "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 85,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seiji_shikin",
          "line": 521,
          "module_chain": [
            "backend.crawlers.sources.seiji_shikin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/crawlers/sources/courts_hanrei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei",
          "enabled": true,
          "line": 73
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 224,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n            ON CONFLICT (code) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "src_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 285,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 192,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei",
          "line": 73,
          "module_chain": [
            "backend.crawlers.sources.courts_hanrei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "courts_hanrei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:00",
          "command": "python3 -m backend.crawlers.sources.courts_hanrei --pages-max 50",
          "modules": [
            "backend.crawlers.sources.courts_hanrei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:00:00+09:00",
              "beijing": "2026-11-05T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:00:00+09:00",
              "beijing": "2026-11-06T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 73,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 328,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nite_jiko",
          "enabled": true,
          "line": 154
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NITE 製品事故情報",
      "source_url": "https://www.nite.go.jp/jiko/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nite.go.jp/jiko/jikojohou/information/index.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.nite.go.jp",
          "symbol": "DATA_BASE",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 69,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nite_jiko",
          "line": 154,
          "module_chain": [
            "backend.crawlers.sources.nite_jiko"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 328,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nite_jiko",
          "enabled": true,
          "line": 154
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NITE 製品事故情報",
      "source_url": "https://www.nite.go.jp/jiko/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nite.go.jp/jiko/jikojohou/information/index.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.nite.go.jp",
          "symbol": "DATA_BASE",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 69,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nite_jiko",
          "line": 154,
          "module_chain": [
            "backend.crawlers.sources.nite_jiko"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            ) VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                '{\"strategy\":\"incremental\",\"scope\":\"latest_100_bankruptcy_flash\",\"country\":\"Japan\"}'::jsonb,\n                '{\"tos_checked\":true,\"public_page\":true,\"notes\":\"Public TDB bankruptcy flash report search loader; stores compact factual signals and source URLs.\"}'::jsonb\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_active=EXCLUDED.is_active,\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/npo.py",
          "line": 77,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 127,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "geps",
          "enabled": true,
          "line": 648
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/geps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "url",
          "file": "backend/crawlers/sources/geps.py",
          "line": 82,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "geps",
          "line": 648,
          "module_chain": [
            "backend.crawlers.sources.geps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 127,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "geps",
          "enabled": true,
          "line": 648
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/geps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "url",
          "file": "backend/crawlers/sources/geps.py",
          "line": 82,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "geps",
          "line": 648,
          "module_chain": [
            "backend.crawlers.sources.geps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin_donors.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 329,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 221,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 223,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 265,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "prtimes",
          "enabled": true,
          "line": 38
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "PR TIMES プレスリリース",
      "source_url": "https://prtimes.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://prtimes.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://prtimes.jp/sitemap-news.xml",
          "symbol": "SITEMAP_NEWS",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "prtimes",
          "line": 38,
          "module_chain": [
            "backend.crawlers.sources.prtimes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 223,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 265,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "prtimes",
          "enabled": true,
          "line": 38
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "PR TIMES プレスリリース",
      "source_url": "https://prtimes.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://prtimes.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://prtimes.jp/sitemap-news.xml",
          "symbol": "SITEMAP_NEWS",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "prtimes",
          "line": 38,
          "module_chain": [
            "backend.crawlers.sources.prtimes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 445,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "security_companies",
          "enabled": true,
          "line": 1026
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "source_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "security_companies",
          "line": 1026,
          "module_chain": [
            "backend.crawlers.sources.security_companies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 445,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "security_companies",
          "enabled": true,
          "line": 1026
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "source_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "security_companies",
          "line": 1026,
          "module_chain": [
            "backend.crawlers.sources.security_companies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 363,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 428,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "partnership_declaration",
          "enabled": true,
          "line": 539
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "パートナーシップ構築宣言",
      "source_url": "https://www.biz-partnership.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/declaration/",
          "symbol": "PDF_BASE",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 111,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 499,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "partnership_declaration",
          "line": 539,
          "module_chain": [
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps",
          "line": 722,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "line": 728,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 363,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 428,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "partnership_declaration",
          "enabled": true,
          "line": 539
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "パートナーシップ構築宣言",
      "source_url": "https://www.biz-partnership.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/declaration/",
          "symbol": "PDF_BASE",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 111,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 499,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "partnership_declaration",
          "line": 539,
          "module_chain": [
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps",
          "line": 722,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "line": 728,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "takken_registry",
      "crawler": "backend/crawlers/sources/takken_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "takken_registry",
          "enabled": true,
          "line": 449
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "建設業者・宅建業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/sokatsuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "takken_registry",
          "line": 449,
          "module_chain": [
            "backend.crawlers.sources.takken_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "takken_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 11:00",
          "command": "python3 -m backend.crawlers.sources.takken_registry",
          "modules": [
            "backend.crawlers.sources.takken_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T11:00:00+09:00",
              "beijing": "2026-11-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T11:00:00+09:00",
              "beijing": "2026-12-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T11:00:00+09:00",
              "beijing": "2027-01-07T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 449,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 248,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            )\n            VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                jsonb_build_object('rps', 0.5, 'scope', 'Japan dishonor and bankruptcy notices'),\n                jsonb_build_object(\n                    'source_page_confirmed_at', '2026-05-31',\n                    'scope', 'Japan public corporate dishonor and insolvency table facts'\n                )\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_activ"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 83,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gyoseishoshi",
          "enabled": true,
          "line": 443
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "行政書士検索",
      "source_url": "https://www.gyosei.or.jp/members-search",
      "crawler_url_candidates": [
        {
          "url": "https://www.gyosei.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/api/v1/members/{member_id}",
          "symbol": "DETAIL_URL_FMT",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 407,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gyoseishoshi",
          "line": 443,
          "module_chain": [
            "backend.crawlers.sources.gyoseishoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 83,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gyoseishoshi",
          "enabled": true,
          "line": 443
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "行政書士検索",
      "source_url": "https://www.gyosei.or.jp/members-search",
      "crawler_url_candidates": [
        {
          "url": "https://www.gyosei.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/api/v1/members/{member_id}",
          "symbol": "DETAIL_URL_FMT",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 407,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gyoseishoshi",
          "line": 443,
          "module_chain": [
            "backend.crawlers.sources.gyoseishoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 106,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "eco_action21",
          "enabled": true,
          "line": 597
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "source_url": "https://www.ea21.jp/register/ninsho_search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ea21.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 101,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/last_month_certification.pdf",
          "symbol": "PDF_LASTMONTH",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 102,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/recyclable_food.pdf",
          "symbol": "PDF_RECYC",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 103,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/ninsho.pdf",
          "symbol": "PDF_STATS",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 104,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "eco_action21",
          "line": 597,
          "module_chain": [
            "backend.crawlers.sources.eco_action21"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 106,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "eco_action21",
          "enabled": true,
          "line": 597
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "source_url": "https://www.ea21.jp/register/ninsho_search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ea21.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 101,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/last_month_certification.pdf",
          "symbol": "PDF_LASTMONTH",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 102,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/recyclable_food.pdf",
          "symbol": "PDF_RECYC",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 103,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/ninsho.pdf",
          "symbol": "PDF_STATS",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 104,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "eco_action21",
          "line": 597,
          "module_chain": [
            "backend.crawlers.sources.eco_action21"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 279,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hotel_ryokan_intl",
          "enabled": true,
          "line": 557
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "crawler_url_candidates": [
        {
          "url": "https://www.hokoukukan.go.jp/metadata/detail/30",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 66,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hotel_ryokan_intl",
          "line": 557,
          "module_chain": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 279,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hotel_ryokan_intl",
          "enabled": true,
          "line": 557
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "crawler_url_candidates": [
        {
          "url": "https://www.hokoukukan.go.jp/metadata/detail/30",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 66,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hotel_ryokan_intl",
          "line": 557,
          "module_chain": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 362,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 248,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "keidanren_members",
          "enabled": true,
          "line": 363
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経団連 会員一覧",
      "source_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/",
          "symbol": "PORTAL",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 271,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "keidanren_members",
          "line": 363,
          "module_chain": [
            "backend.crawlers.sources.keidanren_members"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 248,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "keidanren_members",
          "enabled": true,
          "line": 363
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経団連 会員一覧",
      "source_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/",
          "symbol": "PORTAL",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 271,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "keidanren_members",
          "line": 363,
          "module_chain": [
            "backend.crawlers.sources.keidanren_members"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 149,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 149,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 251,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 275,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kanpo_tremolo",
          "enabled": true,
          "line": 640
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官報決算データサービス (tremolo)",
      "source_url": "https://kanpo.tremolo.work/",
      "crawler_url_candidates": [
        {
          "url": "https://kanpo.tremolo.work",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/kessan",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/{id}",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_tremolo",
          "line": 640,
          "module_chain": [
            "backend.crawlers.sources.kanpo_tremolo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 251,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 275,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kanpo_tremolo",
          "enabled": true,
          "line": 640
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官報決算データサービス (tremolo)",
      "source_url": "https://kanpo.tremolo.work/",
      "crawler_url_candidates": [
        {
          "url": "https://kanpo.tremolo.work",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/kessan",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/{id}",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_tremolo",
          "line": 640,
          "module_chain": [
            "backend.crawlers.sources.kanpo_tremolo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgrants",
      "crawler": "backend/crawlers/sources/jgrants.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 133,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgrants",
          "enabled": true,
          "line": 1066
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "jGrants 補助金",
      "source_url": "https://www.jgrants-portal.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.jgrants-portal.go.jp/exp",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies",
          "symbol": "url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/{dynamic}",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 171,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgrants",
          "line": 1066,
          "module_chain": [
            "backend.crawlers.sources.jgrants"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jgrants",
          "scheduler": "schedule.yaml",
          "cron": "30 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:30",
          "command": "python3 -m backend.crawlers.sources.jgrants",
          "modules": [
            "backend.crawlers.sources.jgrants"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:30:00+09:00",
              "beijing": "2026-11-04T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:30:00+09:00",
              "beijing": "2026-11-05T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:30:00+09:00",
              "beijing": "2026-11-06T16:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1066,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 70,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jcia_cosmetics",
          "enabled": true,
          "line": 994
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本化粧品工業会 会員企業一覧",
      "source_url": "https://www.jcia.org/admin/memberlist",
      "crawler_url_candidates": [
        {
          "url": "https://www.jcia.org/admin/memberlist",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.jcia.org/admin/memberlist{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jcia_cosmetics",
          "line": 994,
          "module_chain": [
            "backend.crawlers.sources.jcia_cosmetics"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 70,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jcia_cosmetics",
          "enabled": true,
          "line": 994
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本化粧品工業会 会員企業一覧",
      "source_url": "https://www.jcia.org/admin/memberlist",
      "crawler_url_candidates": [
        {
          "url": "https://www.jcia.org/admin/memberlist",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.jcia.org/admin/memberlist{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jcia_cosmetics",
          "line": 994,
          "module_chain": [
            "backend.crawlers.sources.jcia_cosmetics"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 473,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            )\n            VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                jsonb_build_object('rps', 0.2, 'country', 'Japan', 'mode', 'public-watchlist-facts'),\n                jsonb_build_object(\n                    'source_page_confirmed_at', '2026-05-31',\n                    'scope', 'Japan country-filtered debtor and blacklist facts only'\n                )\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_activ"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jnet21_support_programs",
      "crawler": "backend/crawlers/sources/jnet21_support_programs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jnet21_support_programs",
          "enabled": true,
          "line": 677
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "enabled": true,
          "line": 683
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-Net21 支援情報ヘッドライン 補助金・助成金・融資",
      "source_url": "https://j-net21.smrj.go.jp/snavi2/",
      "crawler_url_candidates": [
        {
          "url": "https://j-net21.smrj.go.jp/snavi/support/support.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/results.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/",
          "symbol": "DETAIL_BASE",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jnet21_support_programs",
          "line": 677,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "line": 683,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jnet21_support_programs",
          "scheduler": "schedule.yaml",
          "cron": "45 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:45",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode rss --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:45:00+09:00",
              "beijing": "2026-11-04T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:45:00+09:00",
              "beijing": "2026-11-05T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:45:00+09:00",
              "beijing": "2026-11-06T01:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 677,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "scheduler": "schedule.yaml",
          "cron": "20 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 03:20",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode full --shard-prefectures --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T03:20:00+09:00",
              "beijing": "2026-11-09T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T03:20:00+09:00",
              "beijing": "2026-11-16T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T03:20:00+09:00",
              "beijing": "2026-11-23T02:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 683,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 275,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 293,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaigo_facilities",
          "enabled": true,
          "line": 455
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 介護サービス情報公表システム オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 63,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 64,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaigo_facilities",
          "line": 455,
          "module_chain": [
            "backend.crawlers.sources.kaigo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 275,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 293,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaigo_facilities",
          "enabled": true,
          "line": 455
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 介護サービス情報公表システム オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 63,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 64,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaigo_facilities",
          "line": 455,
          "module_chain": [
            "backend.crawlers.sources.kaigo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 282,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 46,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 介護サービス情報公表",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 介護サービス情報公表",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 247,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (code, name_ja, name_en, category, authority,\n                                  base_url, license_type, priority, is_active,\n                                  crawl_config)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, TRUE, %s::jsonb)\n        ON CONFLICT (code) DO UPDATE SET updated_at=now()\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_html_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_html_done",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 81,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO gbizinfo_html_done (corporate_number, http_status, has_url) VALUES (%s, %s, %s) ON CONFLICT (corporate_number) DO UPDATE SET http_status=EXCLUDED.http_status, has_url=EXCLUDED.has_url, fetched_at=now()"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行"
    },
    {
      "source": "egov_law",
      "crawler": "backend/crawlers/sources/egov_law.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 137,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "egov_law",
          "enabled": true,
          "line": 1057
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "e-Gov 法令検索 API",
      "source_url": "https://laws.e-gov.go.jp/apitop/",
      "crawler_url_candidates": [
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "API",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "url",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 118,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "egov_law",
          "line": 1057,
          "module_chain": [
            "backend.crawlers.sources.egov_law"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "egov_law",
          "scheduler": "schedule.yaml",
          "cron": "0 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:00",
          "command": "python3 -m backend.crawlers.sources.egov_law",
          "modules": [
            "backend.crawlers.sources.egov_law"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:00:00+09:00",
              "beijing": "2026-11-04T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:00:00+09:00",
              "beijing": "2026-11-05T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:00:00+09:00",
              "beijing": "2026-11-06T16:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1057,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 291,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url, priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "benrishi_navi",
          "enabled": true,
          "line": 349
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "弁理士ナビ",
      "source_url": "https://www.benrishi-navi.com/",
      "crawler_url_candidates": [
        {
          "url": "https://www.benrishi-navi.com",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "ENDPOINT",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 228,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "benrishi_navi",
          "line": 349,
          "module_chain": [
            "backend.crawlers.sources.benrishi_navi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "benrishi_navi",
          "enabled": true,
          "line": 349
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "弁理士ナビ",
      "source_url": "https://www.benrishi-navi.com/",
      "crawler_url_candidates": [
        {
          "url": "https://www.benrishi-navi.com",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "ENDPOINT",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 228,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "benrishi_navi",
          "line": 349,
          "module_chain": [
            "backend.crawlers.sources.benrishi_navi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/fben.py",
          "line": 339,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 674,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "なでしこ銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 674,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "なでしこ銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 676,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "健康経営銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 676,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "健康経営銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 75,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jaha_animal_hospitals",
          "enabled": true,
          "line": 1001
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JAHA認定動物病院一覧",
      "source_url": "https://animal-hospital.jaha.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://animal-hospital.jaha.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://animal-hospital.jaha.or.jp/post-sitemap.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jaha_animal_hospitals",
          "line": 1001,
          "module_chain": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 75,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jaha_animal_hospitals",
          "enabled": true,
          "line": 1001
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JAHA認定動物病院一覧",
      "source_url": "https://animal-hospital.jaha.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://animal-hospital.jaha.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://animal-hospital.jaha.or.jp/post-sitemap.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jaha_animal_hospitals",
          "line": 1001,
          "module_chain": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 93,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mof_sanctions",
          "enabled": true,
          "line": 54
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "外務省 経済制裁",
      "source_url": "https://www.mofa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mof.go.jp/policy/international_policy/gaitame_kawase/gaitame/economic_sanctions/list.html",
          "symbol": "LIST_PAGE",
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mof_sanctions",
          "line": 54,
          "module_chain": [
            "backend.crawlers.sources.mof_sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 93,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mof_sanctions",
          "enabled": true,
          "line": 54
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "外務省 経済制裁",
      "source_url": "https://www.mofa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mof.go.jp/policy/international_policy/gaitame_kawase/gaitame/economic_sanctions/list.html",
          "symbol": "LIST_PAGE",
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mof_sanctions",
          "line": 54,
          "module_chain": [
            "backend.crawlers.sources.mof_sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 104,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jicpa_registry",
          "enabled": true,
          "line": 343
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本公認会計士協会 公認会計士等検索システム",
      "source_url": "https://registry.jicpa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://registry.jicpa.or.jp/cpa_search",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 92,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 93,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_search",
          "symbol": "AUDIT_LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 95,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "AUDIT_DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 96,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 529,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 422,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jicpa_registry",
          "line": 343,
          "module_chain": [
            "backend.crawlers.sources.jicpa_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 104,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jicpa_registry",
          "enabled": true,
          "line": 343
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本公認会計士協会 公認会計士等検索システム",
      "source_url": "https://registry.jicpa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://registry.jicpa.or.jp/cpa_search",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 92,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 93,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_search",
          "symbol": "AUDIT_LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 95,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "AUDIT_DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 96,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 529,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 422,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jicpa_registry",
          "line": 343,
          "module_chain": [
            "backend.crawlers.sources.jicpa_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "construction_licenses",
          "enabled": true,
          "line": 587
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "建設業者 全国 (国交省 + 47都道府県)",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/ksGaiyo.do",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "construction_licenses",
          "line": 587,
          "module_chain": [
            "backend.crawlers.sources.construction_licenses"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "construction_licenses",
          "enabled": true,
          "line": 587
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "建設業者 全国 (国交省 + 47都道府県)",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/ksGaiyo.do",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "construction_licenses",
          "line": 587,
          "module_chain": [
            "backend.crawlers.sources.construction_licenses"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "field_lineage",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "field_lineage",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 561,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO field_lineage (\n            table_name, column_name, source_code, source_name_cn,\n            parser_module, parser_function, parser_logic,\n            example_value, description, last_written_at, parser_version\n        ) VALUES (\n            'npo_facilities', %(col)s, 'npo_houjin', 'NPO 法人 portal (内閣府)',\n            'backend.crawlers.sources.npo_facilities', 'parse_csv_row', %(logic)s,\n            %(example)s, %(desc)s, now(), %(ver)s\n        )\n        ON CONFLICT (table_name, column_name) DO UPDATE SET\n            source_code     = EXCLUDED.source_code,\n            source_name_cn  = EXCLUDED.source_name_cn,\n            parser_module   = EXCLUDED.parser_module,\n            parser_function = EXCLUDED.parser_function,\n            parser_logic    = EXCLUDED.parser_logic,\n            example_value   = EXCLUDED.example_value,\n            description     = EXCLUDED.description,\n            last_written_at = now(),\n            parser_version  = EXCLUDED.parser_version\n  "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 483,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sbt_certified",
          "enabled": true,
          "line": 575
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SBT (Science Based Targets) 認定企業 — 日本",
      "source_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "crawler_url_candidates": [
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "COMPANIES_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "TARGETS_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 510,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 516,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sbt_certified",
          "line": 575,
          "module_chain": [
            "backend.crawlers.sources.sbt_certified"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 483,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sbt_certified",
          "enabled": true,
          "line": 575
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SBT (Science Based Targets) 認定企業 — 日本",
      "source_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "crawler_url_candidates": [
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "COMPANIES_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "TARGETS_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 510,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 516,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sbt_certified",
          "line": 575,
          "module_chain": [
            "backend.crawlers.sources.sbt_certified"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_discovered_urls",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_discovered_urls",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 906,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_discovered_urls (\n            source_id, source_record_type, source_record_id,\n            source_url, source_url_hash, discovery_scope,\n            discovered_from_url, discovery_context\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb)\n        ON CONFLICT (source_id, source_url_hash)\n        DO UPDATE SET\n            source_record_id = COALESCE(EXCLUDED.source_record_id, kanpo_discovered_urls.source_record_id),\n            discovery_scope = CASE\n                WHEN kanpo_discovered_urls.status = 'fetched' THEN kanpo_discovered_urls.discovery_scope\n                ELSE EXCLUDED.discovery_scope\n            END,\n            discovered_from_url = CASE\n                WHEN kanpo_discovered_urls.status = 'fetched' THEN kanpo_discovered_urls.discovered_from_url\n                ELSE COALESCE(EXCLUDED.discovered_from_url, kanpo_discovered_urls.discovered_from_url)\n            END,\n            discovery_context = kanpo_discovered_urls.discovery_context || EXC"
        },
        {
          "table": "kanpo_discovered_urls",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 976,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE kanpo_discovered_urls\n           SET status = %s,\n               attempts = attempts + 1,\n               last_error = %s,\n               fetched_at = CASE WHEN %s = 'fetched' THEN now() ELSE fetched_at END,\n               last_seen_at = now()\n         WHERE source_id = %s\n           AND source_url = ANY(%s)\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "invoice_kohyo_api_v1",
      "crawler": "backend/scripts/import_invoice_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 360,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "invoice_kohyo_api_daily",
          "enabled": true,
          "line": 411
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国税庁 適格請求書発行事業者 Web-API v1",
      "source_url": "https://web-api.invoice-kohyo.nta.go.jp/1/",
      "crawler_url_candidates": [
        {
          "url": "https://web-api.invoice-kohyo.nta.go.jp/1",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "invoice_kohyo_api_daily",
          "line": 411,
          "module_chain": [
            "backend.scripts.import_invoice_via_api"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "invoice_kohyo_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 22:30",
          "command": "python3 -m backend.scripts.import_invoice_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_invoice_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T22:30:00+09:00",
              "beijing": "2026-11-03T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T22:30:00+09:00",
              "beijing": "2026-11-04T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T22:30:00+09:00",
              "beijing": "2026-11-05T21:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 411,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "miyagi_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 270,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '宮城県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Miyagi prefecture public excellent industrial-waste licensee Excel exposes representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "宮城県 優良産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "hanshin_expressway_qualified_suppliers",
      "crawler": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "enabled": true,
          "line": 878
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 251,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '阪神高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Hanshin Expressway public qualified-supplier PDFs expose representative titles and names; importer only inserts unique local matches by company name and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "阪神高速道路 有資格者名簿",
      "source_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tokyo_taishin_architect",
      "crawler": "backend/scripts/import_tokyo_taishin_architect_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tokyo_taishin_architect",
          "enabled": true,
          "line": 896
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 306,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Tokyo Metropolitan Government', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public Tokyo seismic diagnosis office register. Corporate-number match requires unique normalized legal entity name plus postal code.',\n             'source_page_url', %s::text,\n             'source_pdf_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "東京都木造住宅耐震診断事務所登録名簿",
      "source_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
      "crawler_url_candidates": [
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/renew/assets/pdf/office_list_1.pdf",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 391,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tokyo_taishin_architect",
          "line": 896,
          "module_chain": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "tokyo_taishin_architect",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:00",
          "command": "python3 -m backend.scripts.import_tokyo_taishin_architect_reps --apply",
          "modules": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:00:00+09:00",
              "beijing": "2027-01-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:00:00+09:00",
              "beijing": "2027-04-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:00:00+09:00",
              "beijing": "2027-07-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 896,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 285,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '香川県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kagawa prefecture public industrial-waste licensee PDFs expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "香川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "university_portrait_private_school",
      "crawler": "backend/scripts/import_university_portrait_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "university_portrait_private_school",
          "enabled": true,
          "line": 884
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 348,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '日本私立学校振興・共済事業団 / 大学ポートレート（私学版）', %s, 'public_html',\n           64, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大学ポートレート（私学版）法人情報",
      "source_url": "https://up-j.shigaku.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 555,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "sitemap_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 556,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "university_portrait_private_school",
          "line": 884,
          "module_chain": [
            "backend.scripts.import_university_portrait_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "university_portrait_private_school",
          "scheduler": "schedule.yaml",
          "cron": "0 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:00",
          "command": "python3 -m backend.scripts.import_university_portrait_representatives --sleep 0.08 --apply",
          "modules": [
            "backend.scripts.import_university_portrait_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:00:00+09:00",
              "beijing": "2027-01-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:00:00+09:00",
              "beijing": "2027-04-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:00:00+09:00",
              "beijing": "2027-07-10T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 884,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ibaraki_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 300,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '茨城県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ibaraki prefecture public excellent industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "茨城県 優良産廃処理業者認定業者一覧",
      "source_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kumamoto_religious_corporations",
      "crawler": "backend/scripts/import_kumamoto_religious_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kumamoto_religious_corporations",
          "enabled": true,
          "line": 890
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 215,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '熊本県 / BODIK オープンデータカタログ', %s, 'public_xlsx',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kumamoto Prefecture religious corporation list. Corporate-number match requires unique normalized corporation name plus address.',\n             'source_page_url', %s::text,\n             'xlsx_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "熊本県 宗教法人名簿",
      "source_url": "https://data.bodik.jp/dataset/430005_00107",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/d8ad9958-6493-4ddd-96f7-d15e4a00c0ef/resource/5c7a5bbb-b91a-4af1-a5e0-679ee25f6716/download/123_r7.8.1.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kumamoto_religious_corporations",
          "line": 890,
          "module_chain": [
            "backend.scripts.import_kumamoto_religious_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kumamoto_religious_corporations",
          "scheduler": "schedule.yaml",
          "cron": "30 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:30",
          "command": "python3 -m backend.scripts.import_kumamoto_religious_reps --apply",
          "modules": [
            "backend.scripts.import_kumamoto_religious_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:30:00+09:00",
              "beijing": "2027-01-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:30:00+09:00",
              "beijing": "2027-04-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:30:00+09:00",
              "beijing": "2027-07-10T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 890,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "field_lineage",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "field_lineage",
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 104,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO field_lineage\n       (table_name, column_name, source_code, parser_module,\n        parser_function, description, parser_version, last_written_at)\nVALUES\n       ('company_industry_inferred', 'industry_jsic_mid',\n        %(src)s,\n        'backend.scripts.backfill_industry_from_env_sanpai',\n        'main',\n        '産廃情報ネット (環境省) 産業廃棄物処理業者 → JSIC mid=88 (廃棄物処理業). '\n        '通过 business_licenses[license_type=industrial_waste_disposal] join; '\n        'confidence=1.00 (法定許可); idempotent merge into industry_jsic_mid + industry_signals.',\n        'v1',\n        now())\nON CONFLICT (table_name, column_name) DO UPDATE\nSET source_code     = EXCLUDED.source_code,\n    parser_module   = EXCLUDED.parser_module,\n    parser_function = EXCLUDED.parser_function,\n    description     = EXCLUDED.description,\n    parser_version  = EXCLUDED.parser_version,\n    last_written_at = now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "tosankyo_members",
      "crawler": "backend/scripts/import_tosankyo_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 260,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '一般社団法人 東京都産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public regular-member list exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "東京都産業資源循環協会 正会員名簿",
      "source_url": "https://tosankyo.or.jp/regular_member",
      "crawler_url_candidates": [
        {
          "url": "https://tosankyo.or.jp/regular_member",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 385,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '大阪府', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Osaka prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪府 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "yamanashi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamanashi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 308,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '山梨県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Yamanashi prefecture public industrial-waste licensee PDFs expose representative names, addresses, phone numbers, and permit numbers. This importer parses text-layer PDFs and matches conservatively by expanded legal name, using address to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "山梨県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/import_houjin_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 546,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_api_daily",
          "enabled": false,
          "line": 419
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 19:30",
          "command": "python3 -m backend.scripts.import_houjin_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 419,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tyc-nta-daily.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 18:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.import_houjin_via_api --daily --rps 3",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:30:00+00:00",
              "beijing": "2026-11-04T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:30:00+00:00",
              "beijing": "2026-11-05T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:30:00+00:00",
              "beijing": "2026-11-06T02:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-nta-daily.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 18:30:00 UTC ; next_elapse=Tue 2026-11-03 18:30:00 UTC }\nNextElapseUSecRealtime=Tue 2026-11-03 18:30:00 UTC\nLastTriggerUSec=Mon 2026-11-02 18:30:01 UTC\nId=tyc-nta-daily.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "aomori_alis_supporter",
      "crawler": "backend/scripts/import_aomori_alis_supporter_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 347,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Aomori Prefectural Education Center', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public school supporter directory. Corporate-number match requires unique postal code, normalized company name, and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "青森県総合社会教育センター 学校教育サポーター",
      "source_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
      "crawler_url_candidates": [
        {
          "url": "https://www.alis.pref.aomori.lg.jp/supporter/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "hirakata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_hirakata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 324,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '枚方市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Hirakata city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "枚方市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.hirakata.osaka.jp/0000004004.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fsa_money_lender",
      "crawler": "backend/scripts/import_fsa_money_lender_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_money_lender",
          "enabled": true,
          "line": 770
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 335,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '金融庁 登録貸金業者情報検索サービス',\n            'FSA Registered Money Lender Search Service',\n            'license', '金融庁', %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.2, 'mode', 'official-search-export-html'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.complian"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融庁 登録貸金業者情報検索サービス",
      "source_url": "https://clearing.fsa.go.jp/kashikin/index.php",
      "crawler_url_candidates": [
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "source_url",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 518,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_money_lender",
          "line": 770,
          "module_chain": [
            "backend.scripts.import_fsa_money_lender_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "fsa_money_lender",
          "scheduler": "schedule.yaml",
          "cron": "40 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:40",
          "command": "python3 -m backend.scripts.import_fsa_money_lender_reps --download --apply",
          "modules": [
            "backend.scripts.import_fsa_money_lender_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:40:00+09:00",
              "beijing": "2026-11-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:40:00+09:00",
              "beijing": "2026-12-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:40:00+09:00",
              "beijing": "2027-01-08T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 770,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gifu_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_gifu_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 243,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '岐阜県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Gifu prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "岐阜県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.gifu.lg.jp/page/3670.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gifu.lg.jp/page/3670.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "pmark_jmra",
      "crawler": "backend/scripts/import_jmra_pmark_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmark_jmra",
          "enabled": true,
          "line": 800
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 220,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'JMRA プライバシーマーク付与適格決定事業者一覧',\n           'JMRA PrivacyMark Decision List', 'certification',\n           'Japan Marketing Research Association', %s, 'public_web', 'P3',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public PrivacyMark decision list. Corporate-number match requires unique postal code plus normalized company name.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JMRA プライバシーマーク付与適格決定事業者一覧",
      "source_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmark_jmra",
          "line": 800,
          "module_chain": [
            "backend.scripts.import_jmra_pmark_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "pmark_jmra",
          "scheduler": "schedule.yaml",
          "cron": "10 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:10",
          "command": "python3 -m backend.scripts.import_jmra_pmark_representatives --apply",
          "modules": [
            "backend.scripts.import_jmra_pmark_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:10:00+09:00",
              "beijing": "2026-11-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:10:00+09:00",
              "beijing": "2026-12-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:10:00+09:00",
              "beijing": "2027-01-08T08:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 800,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 116,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "takatsuki_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_takatsuki_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 397,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '高槻市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Takatsuki city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "高槻市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "t2fifa_members",
      "crawler": "backend/scripts/import_t2fifa_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "t2fifa_members",
          "enabled": true,
          "line": 806
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 288,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Type II Financial Instruments Firms Association', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public association member register. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "第二種金融商品取引業協会 正会員名簿",
      "source_url": "https://www.t2fifa.or.jp/members/register/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 177,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "source_url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 186,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "t2fifa_members",
          "line": 806,
          "module_chain": [
            "backend.scripts.import_t2fifa_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "t2fifa_members",
          "scheduler": "schedule.yaml",
          "cron": "40 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:40",
          "command": "python3 -m backend.scripts.import_t2fifa_member_representatives --max-pages 80 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_t2fifa_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:40:00+09:00",
              "beijing": "2026-11-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:40:00+09:00",
              "beijing": "2026-12-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:40:00+09:00",
              "beijing": "2027-01-08T08:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 806,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "maebashi_sanpai_disposal_waste_licensees",
      "crawler": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 269,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '前橋市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Maebashi public industrial-waste disposal licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "前橋市 産業廃棄物処分業者名簿",
      "source_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nta_houjin",
      "crawler": "backend/scripts/import_houjin_bangou.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_daily",
          "enabled": true,
          "line": 380
        },
        {
          "task": "nta_houjin_monthly",
          "enabled": true,
          "line": 386
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 403,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE data_sources\n           SET crawl_config = jsonb_set(\n               COALESCE(crawl_config, '{}'::jsonb),\n               %s::text[],\n               to_jsonb(%s::text),\n               true),\n               updated_at = now()\n         WHERE code = %s\n        "
        },
        {
          "table": "data_sources",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 797,
          "origin": "online",
          "kind": "sql_write",
          "sql": "Don't update data_sources.crawl_config (useful for fixture replay)."
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国税庁 法人番号公表サイト",
      "source_url": "https://www.houjin-bangou.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.houjin-bangou.nta.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/index.html",
          "symbol": "ZENKEN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/",
          "symbol": "SABUN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/index.html",
          "symbol": "SABUN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 70,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nta_houjin_daily",
          "line": 380,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        },
        {
          "task": "nta_houjin_monthly",
          "line": 386,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 19:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode daily",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T19:00:00+09:00",
              "beijing": "2026-11-03T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T19:00:00+09:00",
              "beijing": "2026-11-04T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T19:00:00+09:00",
              "beijing": "2026-11-05T18:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 380,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nta_houjin_monthly",
          "scheduler": "schedule.yaml",
          "cron": "0 18 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 18:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode monthly",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T18:00:00+09:00",
              "beijing": "2026-11-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T18:00:00+09:00",
              "beijing": "2026-12-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T18:00:00+09:00",
              "beijing": "2027-01-05T17:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 386,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_chintai_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 39,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国土交通省 賃貸住宅管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_mansion_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 48,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国土交通省 マンション管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jutaku_shukuhaku_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 57,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国土交通省 住宅宿泊管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "iwate_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_iwate_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 403,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '岩手県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Iwate prefecture public industrial-waste licensee PDFs expose representative names, addresses, and permit numbers. This importer parses text-layer PDF word coordinates and matches conservatively by expanded legal name, using address to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "岩手県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "niigata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_niigata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 254,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '新潟県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Niigata prefecture public industrial-waste licensee Excels expose representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "新潟県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_shareholders.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_shareholders",
          "enabled": true,
          "line": 318
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_shareholders",
          "line": 318,
          "module_chain": [
            "backend.scripts.fetch_edinet_shareholders"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "edinet_shareholders",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.scripts.fetch_edinet_shareholders",
          "modules": [
            "backend.scripts.fetch_edinet_shareholders"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 318,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 146,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE raw_documents\n           SET parsed=TRUE, parsed_at=now(), parser_version=%s\n         WHERE id=%s AND fetched_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aomori_sanpai_association_members",
      "crawler": "backend/scripts/import_aomori_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 219,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '一般社団法人 青森県産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public member list exposes representative titles/names, addresses, phone and fax. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "青森県産業資源循環協会 協会員名簿",
      "source_url": "http://www.aosanpaikyou.or.jp/member-list",
      "crawler_url_candidates": [
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "source_url",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 301,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "soumu_registered_telecom",
      "crawler": "backend/scripts/import_soumu_registered_telecom_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 33,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "soumu_registered_telecom",
          "enabled": true,
          "line": 776
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 222,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '総務省', %s, 'CC-BY', 'P2',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Official MIC/Soumu XLS for operators registered under Telecommunications Business Act Article 9. Includes corporate number and representative.',\n             'source_url', %s::text,\n             'data_portal_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "総務省 登録電気通信事業者一覧",
      "source_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "soumu_registered_telecom",
          "line": 776,
          "module_chain": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "soumu_registered_telecom",
          "scheduler": "schedule.yaml",
          "cron": "10 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:10",
          "command": "python3 -m backend.scripts.import_soumu_registered_telecom_reps --apply",
          "modules": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:10:00+09:00",
              "beijing": "2026-11-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:10:00+09:00",
              "beijing": "2026-12-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:10:00+09:00",
              "beijing": "2027-01-08T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 776,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_downstream_links",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_downstream_links",
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 219,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_downstream_links (\n            notice_id, source_record_id, target_table, target_id,\n            target_partition_date, derivation_type, parser_version, inputs\n        ) VALUES (\n            %s, %s, 'risk_events', %s,\n            %s, 'risk_event_upsert', %s, %s\n        )\n        ON CONFLICT (notice_id, target_table, target_id, target_partition_date)\n        DO UPDATE SET\n            source_record_id = COALESCE(EXCLUDED.source_record_id, kanpo_downstream_links.source_record_id),\n            parser_version = EXCLUDED.parser_version,\n            inputs = kanpo_downstream_links.inputs || EXCLUDED.inputs\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "chiba_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_chiba_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 227,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '千葉県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Chiba prefecture public industrial-waste licensee PDFs expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'pdf_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "千葉県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_city_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_city_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '大阪市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Osaka City public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb,\n             'license', 'CC-BY-4.0'\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jsda_members",
      "crawler": "backend/scripts/import_jsda_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jsda_members",
          "enabled": true,
          "line": 812
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 345,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Japan Securities Dealers Association', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public JSDA member lists. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本証券業協会 会員名簿",
      "source_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jsda_members",
          "line": 812,
          "module_chain": [
            "backend.scripts.import_jsda_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jsda_members",
          "scheduler": "schedule.yaml",
          "cron": "10 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:10",
          "command": "python3 -m backend.scripts.import_jsda_member_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_jsda_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:10:00+09:00",
              "beijing": "2026-11-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:10:00+09:00",
              "beijing": "2026-12-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:10:00+09:00",
              "beijing": "2027-01-08T09:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 812,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yamagata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamagata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 328,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '山形県', %s,\n           'public_excel_zip', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Yamagata prefecture public industrial-waste licensee Excel ZIP exposes representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'zip_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "山形県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "imaj_advice_disclosure",
      "crawler": "backend/scripts/import_imaj_advice_disclosure_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_advice_disclosure",
          "enabled": true,
          "line": 818
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 322,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Asset Management Association of Japan', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public investment-advice member disclosure PDFs. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資産運用業協会 投資助言・代理会員台帳",
      "source_url": "https://www.imaj.or.jp/members/disclosure/advice/",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_advice_disclosure",
          "line": 818,
          "module_chain": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_advice_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "40 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:40",
          "command": "python3 -m backend.scripts.import_imaj_advice_disclosure_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:40:00+09:00",
              "beijing": "2026-11-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:40:00+09:00",
              "beijing": "2026-12-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:40:00+09:00",
              "beijing": "2027-01-08T09:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 818,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_html_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_html_done",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 81,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "INSERT INTO gbizinfo_html_done (corporate_number, http_status, has_url) VALUES (%s, %s, %s) ON CONFLICT (corporate_number) DO UPDATE SET http_status=EXCLUDED.http_status, has_url=EXCLUDED.has_url, fetched_at=now()"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_establishment_from_edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 346,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "backfill",
      "schedule_plans": [
        {
          "task": "tyc-establishment-edinet.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 04:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.backfill_establishment_from_edinet --incremental",
          "modules": [
            "backend.scripts.backfill_establishment_from_edinet"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+00:00",
              "beijing": "2026-11-04T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+00:00",
              "beijing": "2026-11-05T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+00:00",
              "beijing": "2026-11-06T12:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-establishment-edinet.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 04:30:00 UTC ; next_elapse=Wed 2026-11-04 04:30:00 UTC }\nNextElapseUSecRealtime=Wed 2026-11-04 04:30:00 UTC\nLastTriggerUSec=Tue 2026-11-03 04:30:01 UTC\nId=tyc-establishment-edinet.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "toyama_sanpai_association_members",
      "crawler": "backend/scripts/import_toyama_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 233,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '公益社団法人 富山県産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public disposal-company list exposes representative names, addresses, phone numbers, and permit flags. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "富山県産業資源循環協会 処理業許可業者名簿",
      "source_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
      "crawler_url_candidates": [
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "source_url",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyama_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyama_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 252,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '富山県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Toyama prefecture public industrial-waste licensee Excel exposes representative role/name and head-office address in four-row blocks. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "富山県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "fukui_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_fukui_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 254,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '福井県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Fukui prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "福井県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "aichi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_aichi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n            priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '愛知県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Aichi prefecture public industrial-waste licensee Excel exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "愛知県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "enecho_retail_gas",
      "crawler": "backend/scripts/import_enecho_retail_gas_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_gas",
          "enabled": true,
          "line": 752
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 162,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '資源エネルギー庁 登録ガス小売事業者一覧',\n            'ANRE Registered Retail Gas Suppliers', 'license', '資源エネルギー庁',\n            %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.1, 'mode', 'manual-cache-or-low-rate'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.compliance"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資源エネルギー庁 登録ガス小売事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 33,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_gas",
          "line": 752,
          "module_chain": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_gas",
          "scheduler": "schedule.yaml",
          "cron": "20 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:20",
          "command": "python3 -m backend.scripts.import_enecho_retail_gas_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:20:00+09:00",
              "beijing": "2026-11-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:20:00+09:00",
              "beijing": "2026-12-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:20:00+09:00",
              "beijing": "2027-01-08T04:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 752,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 203,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active)\n        VALUES (%s, %s, %s, 'license_registry', '厚生労働省', %s,\n                'public_domain', 'P1', TRUE)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          category=EXCLUDED.category,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kaigo_service_rep_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kaigo_service_rep_done",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 418,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kaigo_service_rep_done\n          (corporate_number, status, company_name, company_kind, facility_code,\n           service_code, facility_name, service_type, raw_name, display_name,\n           position, source_url, error_message, updated_at)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          status=EXCLUDED.status,\n          company_name=EXCLUDED.company_name,\n          company_kind=EXCLUDED.company_kind,\n          facility_code=EXCLUDED.facility_code,\n          service_code=EXCLUDED.service_code,\n          facility_name=EXCLUDED.facility_name,\n          service_type=EXCLUDED.service_type,\n          raw_name=EXCLUDED.raw_name,\n          display_name=EXCLUDED.display_name,\n          position=EXCLUDED.position,\n          source_url=EXCLUDED.source_url,\n          error_message=EXCLUDED.error_message,\n          updated_at=now()\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "osaka_medical_corporation_reports",
      "crawler": "backend/scripts/import_osaka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 790,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '大阪府', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "大阪府医療法人事業報告書等",
      "source_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "toyonaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyonaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 329,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '豊中市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Toyonaka city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "豊中市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "ishikawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ishikawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 249,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '石川県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ishikawa prefecture public industrial-waste licensee Excels expose representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "石川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "sme_ma_support_institution",
      "crawler": "backend/scripts/import_sme_ma_support_institution_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 261,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '中小企業庁', %s, 'public_web', 'P2',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public M&A support institution registry detail cards expose corporate number and representative name for corporate registrants.',\n             'source_url', %s::text,\n             'livewire_endpoint', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "中小企業庁 M&A支援機関登録制度 登録支援機関データベース",
      "source_url": "https://ma-shienkikan.go.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/livewire/message/frontend.published-card",
          "symbol": "LIVEWIRE_ENDPOINT",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "source_url",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 380,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "molink_company_profiles",
      "crawler": "backend/scripts/import_molink_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "molink_company_profiles",
          "enabled": true,
          "line": 848
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 256,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '一般社団法人 全国木材組合連合会 木材SCM支援システム もりんく', %s, 'public_html',\n           62, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "木材SCM支援システム もりんく 事業者詳細",
      "source_url": "https://molink.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://molink.jp/search",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "BASE_PROFILE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "profile_url_template",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 280,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "molink_company_profiles",
          "line": 848,
          "module_chain": [
            "backend.scripts.import_molink_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "molink_company_profiles",
          "scheduler": "schedule.yaml",
          "cron": "30 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:30",
          "command": "python3 -m backend.scripts.import_molink_representatives --start-id 1 --end-id 3000 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_molink_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:30:00+09:00",
              "beijing": "2026-11-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:30:00+09:00",
              "beijing": "2026-12-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:30:00+09:00",
              "beijing": "2027-01-09T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 848,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kanagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kanagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 229,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '神奈川県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kanagawa prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "神奈川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 116,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 255,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active)\n        VALUES (%s, %s, %s, 'license_registry', '厚生労働省 / 独立行政法人福祉医療機構', %s,\n                'public_registry', 'P1', TRUE)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          category=EXCLUDED.category,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "wam_disability_rep_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "wam_disability_rep_done",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 472,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO wam_disability_rep_done\n          (corporate_number, status, company_name, company_kind, facility_code,\n           service_code, facility_name, service_type, system_no, raw_name,\n           display_name, position, source_url, error_message, updated_at)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          status=EXCLUDED.status,\n          company_name=EXCLUDED.company_name,\n          company_kind=EXCLUDED.company_kind,\n          facility_code=EXCLUDED.facility_code,\n          service_code=EXCLUDED.service_code,\n          facility_name=EXCLUDED.facility_name,\n          service_type=EXCLUDED.service_type,\n          system_no=EXCLUDED.system_no,\n          raw_name=EXCLUDED.raw_name,\n          display_name=EXCLUDED.display_name,\n          position=EXCLUDED.position,\n          source_url=EXCLUDED.source_url,\n          error_message=EXCLUDED.error_message,\n          updated_at=now()\n "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gunma_medical_corporation_reports",
      "crawler": "backend/scripts/import_gunma_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gunma_medical_corporation_reports",
          "enabled": true,
          "line": 902
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 476,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '群馬県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "群馬県医療法人事業報告書等",
      "source_url": "https://www.pref.gunma.jp/page/716575.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gunma.jp/page/716575.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gunma_medical_corporation_reports",
          "line": 902,
          "module_chain": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "gunma_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "30 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:30",
          "command": "python3 -m backend.scripts.import_gunma_medical_corporation_reps --max-zips 6 --max-pdfs 600 --ocr-missing --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:30:00+09:00",
              "beijing": "2027-01-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:30:00+09:00",
              "beijing": "2027-04-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:30:00+09:00",
              "beijing": "2027-07-10T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 902,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "wam_social_welfare_current_report",
      "crawler": "backend/scripts/import_wam_social_welfare_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wam_social_welfare_current_report",
          "enabled": true,
          "line": 854
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 287,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'disclosure',\n           '独立行政法人福祉医療機構 / 社会福祉法人の財務諸表等電子開示システム',\n           %s, 'public_html_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public WAM NET corporation detail pages and current-status reports. Representative is extracted from the director table role code 1 理事長.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "WAM NET 社会福祉法人 現況報告書",
      "source_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "TOP_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0216000E01.do",
          "symbol": "CORP_NO_SEARCH_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 365,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wam_social_welfare_current_report",
          "line": 854,
          "module_chain": [
            "backend.scripts.import_wam_social_welfare_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "wam_social_welfare_current_report",
          "scheduler": "schedule.yaml",
          "cron": "0 7 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 07:00",
          "command": "python3 -m backend.scripts.import_wam_social_welfare_reps --limit 10000 --sleep 0.2 --apply",
          "modules": [
            "backend.scripts.import_wam_social_welfare_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T07:00:00+09:00",
              "beijing": "2026-12-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T07:00:00+09:00",
              "beijing": "2027-01-09T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 854,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nexco_east_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_east_qualified_suppliers",
          "enabled": true,
          "line": 866
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 289,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '東日本高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'NEXCO East public qualified-supplier list exposes representative titles and names; importer only inserts unique local matches by company name and postal code.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NEXCO東日本 有資格者情報検索",
      "source_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
      "crawler_url_candidates": [
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 372,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_east_qualified_suppliers",
          "line": 866,
          "module_chain": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_east_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:30",
          "command": "python3 -m backend.scripts.import_nexco_east_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:30:00+09:00",
              "beijing": "2026-11-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:30:00+09:00",
              "beijing": "2026-12-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:30:00+09:00",
              "beijing": "2027-01-09T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 866,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fukuoka_medical_corporation_reports",
      "crawler": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 519,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '福岡県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "福岡県医療法人事業報告書等",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nexco_west_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_west_qualified_suppliers",
          "enabled": true,
          "line": 872
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 242,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '西日本高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'NEXCO West public qualified-supplier Excel files expose representative names; importer only inserts unique local matches by company name and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "NEXCO西日本 有資格者名簿",
      "source_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
      "crawler_url_candidates": [
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 325,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tochigi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tochigi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 322,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '栃木県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Tochigi prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "栃木県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "company_location_profile",
      "crawler": "backend/scripts/derive_company_location_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_location_profile",
          "enabled": true,
          "line": 305
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "企業所在地・不動産環境プロファイル",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_location_profile",
          "line": 305,
          "module_chain": [
            "backend.scripts.derive_company_location_profiles"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "derived",
      "schedule_plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_html",
          "enabled": true,
          "line": 616
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 142,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "isico_dgnet",
      "crawler": "backend/scripts/import_isico_dgnet_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isico_dgnet",
          "enabled": true,
          "line": 830
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 287,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'ISICO DGnet 企業情報',\n           'ISICO DGnet Company Directory', 'directory',\n           'Ishikawa Sunrise Industries Creation Organization', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public DGnet company directory. Corporate-number match requires unique postal code plus normalized company name.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ISICO DGnet 企業情報",
      "source_url": "https://www.isico.or.jp/company/",
      "crawler_url_candidates": [
        {
          "url": "https://www.isico.or.jp",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.isico.or.jp/company/",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isico_dgnet",
          "line": 830,
          "module_chain": [
            "backend.scripts.import_isico_dgnet_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "isico_dgnet",
          "scheduler": "schedule.yaml",
          "cron": "0 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:00",
          "command": "python3 -m backend.scripts.import_isico_dgnet_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_isico_dgnet_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:00:00+09:00",
              "beijing": "2026-11-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:00:00+09:00",
              "beijing": "2026-12-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:00:00+09:00",
              "beijing": "2027-01-09T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 830,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sakai_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_sakai_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 302,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '堺市', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Sakai city public industrial-waste licensee Excels expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "堺市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "moj_registered_support_org",
      "crawler": "backend/scripts/import_moj_registered_support_org_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_registered_support_org",
          "enabled": true,
          "line": 764
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 281,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '出入国在留管理庁 登録支援機関登録簿',\n            'Immigration Services Agency Registered Support Organization List',\n            'license', '出入国在留管理庁', %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.2, 'mode', 'official-excel-download'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_recor"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "出入国在留管理庁 登録支援機関登録簿",
      "source_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 463,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_registered_support_org",
          "line": 764,
          "module_chain": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "moj_registered_support_org",
          "scheduler": "schedule.yaml",
          "cron": "10 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:10",
          "command": "python3 -m backend.scripts.import_moj_registered_support_org_reps --download --apply",
          "modules": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:10:00+09:00",
              "beijing": "2026-11-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:10:00+09:00",
              "beijing": "2026-12-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:10:00+09:00",
              "beijing": "2027-01-08T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 764,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "saitama_medical_corporation_reports",
      "crawler": "backend/scripts/import_saitama_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "saitama_medical_corporation_reports",
          "enabled": true,
          "line": 908
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 498,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '埼玉県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "埼玉県医療法人決算届",
      "source_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "saitama_medical_corporation_reports",
          "line": 908,
          "module_chain": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "saitama_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "0 7 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 07:00",
          "command": "python3 -m backend.scripts.import_saitama_medical_corporation_reps --max-zips 30 --max-pdfs 600 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T07:00:00+09:00",
              "beijing": "2027-01-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T07:00:00+09:00",
              "beijing": "2027-04-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T07:00:00+09:00",
              "beijing": "2027-07-10T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 908,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tokyo_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tokyo_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 354,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '東京都', %s,\n           'public_web_search', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Tokyo public industrial-waste licensee search exposes representative names, permit address, postal code, and permit numbers. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text,\n             'license_types', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "東京都 産業廃棄物処理業者情報検索",
      "source_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
      "crawler_url_candidates": [
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_itiran.aspx",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "source_url",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 442,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "kokodesearch_childcare_facility_csv",
      "crawler": "backend/scripts/import_kokodesearch_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "enabled": true,
          "line": 842
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 392,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '独立行政法人福祉医療機構 / 子ども・子育て支援情報公表システム', %s, 'public_csv',\n           63, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV",
      "source_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E00.do",
          "symbol": "CSV_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E06.do",
          "symbol": "CSV_DOWNLOAD_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 599,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "line": 842,
          "module_chain": [
            "backend.scripts.import_kokodesearch_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "scheduler": "schedule.yaml",
          "cron": "0 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:00",
          "command": "python3 -m backend.scripts.import_kokodesearch_representatives --apply",
          "modules": [
            "backend.scripts.import_kokodesearch_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:00:00+09:00",
              "beijing": "2026-11-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:00:00+09:00",
              "beijing": "2026-12-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:00:00+09:00",
              "beijing": "2027-01-09T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 842,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "imaj_investment_management_disclosure",
      "crawler": "backend/scripts/import_imaj_investment_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_investment_management_disclosure",
          "enabled": true,
          "line": 824
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Asset Management Association of Japan', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public investment-management company disclosure PDFs. Corporate-number match requires unique normalized company name plus postal code and address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資産運用業協会 投資運用会社要覧",
      "source_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 263,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_investment_management_disclosure",
          "line": 824,
          "module_chain": [
            "backend.scripts.import_imaj_investment_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_investment_management_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "10 11 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 11:10",
          "command": "python3 -m backend.scripts.import_imaj_investment_management_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_investment_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T11:10:00+09:00",
              "beijing": "2026-11-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T11:10:00+09:00",
              "beijing": "2026-12-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T11:10:00+09:00",
              "beijing": "2027-01-08T10:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 824,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kagoshima_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '鹿児島県', %s,\n           'public_html', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kagoshima prefecture public excellent industrial-waste licensee HTML table exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "鹿児島県 優良産廃処理業者認定基準適合処理業者一覧",
      "source_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 328,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/backfill_representative.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 337,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_representative_done",
          "file": "backend/scripts/backfill_representative.py",
          "line": 301,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO gbizinfo_representative_done\n          (corporate_number, http_status, has_representative, parsed, error,\n           fetched_at, updated_at)\n        VALUES (%s, %s, %s, %s, %s, now(), now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          http_status = EXCLUDED.http_status,\n          has_representative = EXCLUDED.has_representative,\n          parsed = EXCLUDED.parsed,\n          error = EXCLUDED.error,\n          updated_at = now()\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/v1/hojin/{corp}",
          "symbol": "GBIZ_API",
          "file": "backend/scripts/backfill_representative.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "ur_qualified_suppliers",
      "crawler": "backend/scripts/import_ur_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ur_qualified_suppliers",
          "enabled": true,
          "line": 860
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, %s, %s, 'supplier_registry', '独立行政法人都市再生機構',\n            %s, 'public_web', 'P2', true,\n            jsonb_build_object('rps', 0.5, 'mode', 'public-pdf-sweep'),\n            jsonb_build_object(\n                'source_url', %s::text,\n                'note', 'UR publishes qualified supplier PDFs with corporate numbers and representative names.'\n            )\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=true,\n            crawl_config=EXCLUDED.crawl_config,\n     "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "UR都市機構 有資格者名簿",
      "source_url": "https://www.ur-net.go.jp/order/procedure.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 299,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ur_qualified_suppliers",
          "line": 860,
          "module_chain": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "ur_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:00",
          "command": "python3 -m backend.scripts.import_ur_qualified_supplier_reps --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:00:00+09:00",
              "beijing": "2026-11-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:00:00+09:00",
              "beijing": "2026-12-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:00:00+09:00",
              "beijing": "2027-01-09T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 860,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_alcohol",
      "crawler": "backend/scripts/import_meti_alcohol_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_alcohol",
          "enabled": true,
          "line": 758
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 234,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '経済産業省 アルコール事業者名簿',\n            'METI Alcohol Business Operator Lists', 'license', '経済産業省',\n            %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.5, 'mode', 'manual-cache-or-low-rate'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.compliance_record"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経済産業省 アルコール事業者名簿",
      "source_url": "https://www.meti.go.jp/policy/alcohol/openlist/",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "base_url",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 159,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_alcohol",
          "line": 758,
          "module_chain": [
            "backend.scripts.import_meti_alcohol_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "meti_alcohol",
          "scheduler": "schedule.yaml",
          "cron": "40 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:40",
          "command": "python3 -m backend.scripts.import_meti_alcohol_reps --download --apply",
          "modules": [
            "backend.scripts.import_meti_alcohol_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:40:00+09:00",
              "beijing": "2026-11-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:40:00+09:00",
              "beijing": "2026-12-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:40:00+09:00",
              "beijing": "2027-01-08T04:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 758,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "enecho_retail_electric",
      "crawler": "backend/scripts/import_enecho_retail_electric_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_electric",
          "enabled": true,
          "line": 740
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 222,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, '資源エネルギー庁 登録小売電気事業者一覧',\n           'ANRE Registered Retail Electricity Suppliers', 'license',\n           '資源エネルギー庁', %s, 'public_open', 'P1', true,\n           jsonb_build_object('rps', 0.1, 'mode', 'manual-cache-or-low-rate'),\n           jsonb_build_object('source_page_confirmed_at', '2026-05-30'))\n        ON CONFLICT (code) DO UPDATE SET\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "資源エネルギー庁 登録小売電気事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/list.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_electric",
          "line": 740,
          "module_chain": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_electric",
          "scheduler": "schedule.yaml",
          "cron": "0 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:00",
          "command": "python3 -m backend.scripts.import_enecho_retail_electric_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:00:00+09:00",
              "beijing": "2026-11-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:00:00+09:00",
              "beijing": "2026-12-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:00:00+09:00",
              "beijing": "2027-01-08T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 740,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nagano_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_nagano_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 249,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '長野県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Nagano prefecture public industrial-waste licensee Excels expose corporate number, representative name, head-office address, and permit data. This importer matches by corporate number and only reads the all-prefecture sheet to avoid jurisdiction duplicates.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "長野県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "company_geocode_attempts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_geocode_attempts",
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 194,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_geocode_attempts (\n                corporate_number, address_hash, query_address, status,\n                attempts, last_attempted_at, next_retry_at, error_message\n            ) VALUES (\n                %s, %s, %s, %s, 1, now(), "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ehime_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ehime_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 246,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '愛媛県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ehime prefecture public industrial-waste licensee Excels expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "愛媛県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ehime.jp/page/9773.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ehime.jp/page/9773.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 196,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_actions",
          "enabled": true,
          "line": 103
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公正取引委員会 排除措置・課徴金",
      "source_url": "https://www.jftc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jftc.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/houdou/pressrelease/dksochi/{year}/index.html",
          "symbol": "INDEX_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/dk/ichiran/dkhaijo_{year}.html",
          "symbol": "ICHIRAN_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_actions",
          "line": 103,
          "module_chain": [
            "backend.crawlers.sources.jftc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 196,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_actions",
          "enabled": true,
          "line": 103
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公正取引委員会 排除措置・課徴金",
      "source_url": "https://www.jftc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jftc.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/houdou/pressrelease/dksochi/{year}/index.html",
          "symbol": "INDEX_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/dk/ichiran/dkhaijo_{year}.html",
          "symbol": "ICHIRAN_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_actions",
          "line": 103,
          "module_chain": [
            "backend.crawlers.sources.jftc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_bcp_keizokuryoku",
          "enabled": true,
          "line": 1152
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "source_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list",
          "symbol": "DOWNLOAD_BASE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list/renkei_nintei_ichiran.xlsx",
          "symbol": "RENKEI_URL",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "source_page_url",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 268,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_bcp_keizokuryoku",
          "line": 1152,
          "module_chain": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_bcp_keizokuryoku",
          "enabled": true,
          "line": 1152
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "source_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list",
          "symbol": "DOWNLOAD_BASE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list/renkei_nintei_ichiran.xlsx",
          "symbol": "RENKEI_URL",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "source_page_url",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 268,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_bcp_keizokuryoku",
          "line": 1152,
          "module_chain": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 150,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sesc_actions",
          "enabled": true,
          "line": 931
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "証券取引等監視委員会 課徴金事例",
      "source_url": "https://www.fsa.go.jp/sesc/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 160,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 220,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sesc_actions",
          "line": 931,
          "module_chain": [
            "backend.crawlers.sources.sesc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 150,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sesc_actions",
          "enabled": true,
          "line": 931
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "証券取引等監視委員会 課徴金事例",
      "source_url": "https://www.fsa.go.jp/sesc/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 160,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 220,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sesc_actions",
          "line": 931,
          "module_chain": [
            "backend.crawlers.sources.sesc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "isms_ac_certified_orgs",
      "crawler": "backend/crawlers/sources/isms_ac.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isms_ac_certified_orgs",
          "enabled": true,
          "line": 1110
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ISMS-AC ISMS認証取得組織検索",
      "source_url": "https://isms.jp/lst/ind/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://isms.jp/lst/ind/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isms_ac_certified_orgs",
          "line": 1110,
          "module_chain": [
            "backend.crawlers.sources.isms_ac"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "isms_ac_certified_orgs",
          "scheduler": "schedule.yaml",
          "cron": "10 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:10",
          "command": "python3 -m backend.crawlers.sources.isms_ac --details",
          "modules": [
            "backend.crawlers.sources.isms_ac"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:10:00+09:00",
              "beijing": "2026-12-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:10:00+09:00",
              "beijing": "2027-01-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:10:00+09:00",
              "beijing": "2027-02-03T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1110,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 130,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ppc_actions",
          "enabled": true,
          "line": 127
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "個人情報保護委員会 処分",
      "source_url": "https://www.ppc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ppc.go.jp/news/press/{dynamic}/",
          "symbol": "url",
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ppc_actions",
          "line": 127,
          "module_chain": [
            "backend.crawlers.sources.ppc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 130,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ppc_actions",
          "enabled": true,
          "line": 127
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "個人情報保護委員会 処分",
      "source_url": "https://www.ppc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ppc.go.jp/news/press/{dynamic}/",
          "symbol": "url",
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ppc_actions",
          "line": 127,
          "module_chain": [
            "backend.crawlers.sources.ppc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jipdec_pmark",
      "crawler": "backend/crawlers/sources/jipdec_pmark.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jipdec_pmark",
          "enabled": true,
          "line": 1104
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "JIPDEC プライバシーマーク付与事業者検索",
      "source_url": "https://entity-search.jipdec.or.jp/pmark/",
      "crawler_url_candidates": [
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 34,
          "origin": "online"
        },
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jipdec_pmark",
          "line": 1104,
          "module_chain": [
            "backend.crawlers.sources.jipdec_pmark"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jipdec_pmark",
          "scheduler": "schedule.yaml",
          "cron": "40 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:40",
          "command": "python3 -m backend.crawlers.sources.jipdec_pmark",
          "modules": [
            "backend.crawlers.sources.jipdec_pmark"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:40:00+09:00",
              "beijing": "2026-12-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:40:00+09:00",
              "beijing": "2027-01-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:40:00+09:00",
              "beijing": "2027-02-03T03:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1104,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 512,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url, license_type,\n            priority, is_active, crawl_config, compliance_record\n        ) VALUES (\n            %s, %s, %s, 'ip', %s, %s, 'registered_api', 'P0', TRUE,\n            %s::jsonb, %s::jsonb\n        )\n        ON CONFLICT (code) DO UPDATE\n           SET name_ja=EXCLUDED.name_ja,\n               name_en=EXCLUDED.name_en,\n               category=EXCLUDED.category,\n               authority=EXCLUDED.authority,\n               base_url=EXCLUDED.base_url,\n               license_type=EXCLUDED.license_type,\n               priority=EXCLUDED.priority,\n               is_active=EXCLUDED.is_active,\n               crawl_config=data_sources.crawl_config || EXCLUDED.crawl_config,\n               compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n               updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划"
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 101,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_actions",
          "enabled": true,
          "line": 97
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融庁 行政処分",
      "source_url": "https://www.fsa.go.jp/news/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "EXCEL_URL",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 178,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_actions",
          "line": 97,
          "module_chain": [
            "backend.crawlers.sources.fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 101,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_actions",
          "enabled": true,
          "line": 97
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融庁 行政処分",
      "source_url": "https://www.fsa.go.jp/news/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "EXCEL_URL",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 178,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_actions",
          "line": 97,
          "module_chain": [
            "backend.crawlers.sources.fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 144,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 32,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 215,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 144,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 32,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 215,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2277,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 特定商取引法ガイド 執行事例検索",
      "source_url": "https://www.no-trouble.caa.go.jp/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.no-trouble.caa.go.jp/search/",
          "symbol": "NO_TROUBLE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 50,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2277,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 特定商取引法ガイド 執行事例検索",
      "source_url": "https://www.no-trouble.caa.go.jp/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.no-trouble.caa.go.jp/search/",
          "symbol": "NO_TROUBLE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 50,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2386,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警察庁 指定暴力団一覧",
      "source_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2386,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警察庁 指定暴力団一覧",
      "source_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2464,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警察庁 指定重要指名手配",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2464,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "警察庁 指定重要指名手配",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2513,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "都道府県警察 指名手配ページ",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2513,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "都道府県警察 指名手配ページ",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2620,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "source_url": "https://www.fcg-r.co.jp/research/incident.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.fcg-r.co.jp/research/incident.html",
          "symbol": "FCG_INCIDENT_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 59,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2620,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "source_url": "https://www.fcg-r.co.jp/research/incident.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.fcg-r.co.jp/research/incident.html",
          "symbol": "FCG_INCIDENT_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 59,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2671,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "YAKUZA WIKI 民間暴力団情報",
      "source_url": "https://www.yakuza.wiki/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 74,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_LIST_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 75,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2671,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "YAKUZA WIKI 民間暴力団情報",
      "source_url": "https://www.yakuza.wiki/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 74,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_LIST_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 75,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2760,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暴力団ニュース～ヤクザ事件簿",
      "source_url": "https://www.yakuza-news.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza-news.jp/",
          "symbol": "YAKUZA_NEWS_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 76,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/posts",
          "symbol": "YAKUZA_NEWS_POSTS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/categories",
          "symbol": "YAKUZA_NEWS_CATEGORIES_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/tags",
          "symbol": "YAKUZA_NEWS_TAGS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2760,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "暴力団ニュース～ヤクザ事件簿",
      "source_url": "https://www.yakuza-news.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza-news.jp/",
          "symbol": "YAKUZA_NEWS_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 76,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/posts",
          "symbol": "YAKUZA_NEWS_POSTS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/categories",
          "symbol": "YAKUZA_NEWS_CATEGORIES_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/tags",
          "symbol": "YAKUZA_NEWS_TAGS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2928,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公安調査庁 国際テロリズム要覧",
      "source_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
          "symbol": "PSIA_TERROR_ORGS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2928,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公安調査庁 国際テロリズム要覧",
      "source_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
          "symbol": "PSIA_TERROR_ORGS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3061,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経産省 外国ユーザーリスト",
      "source_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "METI_FOREIGN_USER_PRESS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "METI_FOREIGN_USER_PDF_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3098,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "fallback_pdf_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3183,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3061,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経産省 外国ユーザーリスト",
      "source_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "METI_FOREIGN_USER_PRESS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "METI_FOREIGN_USER_PDF_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3098,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "fallback_pdf_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3183,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3192,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "FUKUOKA_BORYOKUDAN_EXCLUSION_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "fukuoka_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3192,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "FUKUOKA_BORYOKUDAN_EXCLUSION_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "fukuoka_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3422,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "静岡県公安委員会 暴力団排除条例 公表結果",
      "source_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "SHIZUOKA_BORYOKUDAN_PUBLIC_NOTICE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "index_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3502,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3422,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "静岡県公安委員会 暴力団排除条例 公表結果",
      "source_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "SHIZUOKA_BORYOKUDAN_PUBLIC_NOTICE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "index_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3502,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7342,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources\n              (code, name_ja, name_en, category, authority, base_url, license_type,\n               priority, is_active, crawl_config, compliance_record)\n            VALUES\n              (%s, '地方自治体 表彰・受賞公告', 'Local Government Public Recognitions',\n               'public_recognition', '地方自治体', NULL, 'public_web', 'P2', TRUE,\n               jsonb_build_object('rps', 0.2, 'concurrency', 1, 'method', 'official_html_news_pages'),\n               jsonb_build_object('note', 'Official local-government award and recognition announcement pages.'))\n            ON CONFLICT (code) DO UPDATE SET\n              updated_at = now(),\n              crawl_config = data_sources.crawl_config || EXCLUDED.crawl_config,\n              compliance_record = data_sources.compliance_record || EXCLUDED.compliance_record\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "local_public_recognition_root_runs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "local_public_recognition_root_runs",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7415,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO local_public_recognition_root_runs\n              (source_id, job_id, root_url, root_url_hash, prefecture, municipality,\n               authority, jurisdiction_type, started_at, finished_at, status,\n               discovered_candidate_urls, candidate_urls, fetched_urls, parsed_records,\n               inserted_records, updated_records, failed_urls, skipped_host_blocked,\n               error_message, meta)\n            VALUES\n              (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n               %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 407,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SEC 会計監査関連処分（AAER）",
      "source_url": "https://www.sec.gov/divisions/enforce/friactions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 407,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "SEC 会計監査関連処分（AAER）",
      "source_url": "https://www.sec.gov/divisions/enforce/friactions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 528,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "米司法省 FCPA 関連処分",
      "source_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 528,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "米司法省 FCPA 関連処分",
      "source_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 683,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "OFAC 50%ルール 間接保有 (派生)",
      "source_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 683,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "OFAC 50%ルール 間接保有 (派生)",
      "source_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 993,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "欧州委員会 反トラスト・カルテル決定",
      "source_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 993,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "欧州委員会 反トラスト・カルテル決定",
      "source_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1093,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "英国 FCA 行政処分",
      "source_url": "https://www.fca.org.uk/news/enforcement",
      "crawler_url_candidates": [
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1093,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "英国 FCA 行政処分",
      "source_url": "https://www.fca.org.uk/news/enforcement",
      "crawler_url_candidates": [
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "data_go_jp_catalog",
      "crawler": "backend/crawlers/sources/data_go_jp_catalog.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "data_go_jp_catalog",
          "enabled": true,
          "line": 1086
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "data.go.jp データカタログ横断検索",
      "source_url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
      "crawler_url_candidates": [
        {
          "url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 30,
          "origin": "online"
        },
        {
          "url": "https://data.e-gov.go.jp/data/dataset/{name}",
          "symbol": "CATALOG_DATASET_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 31,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "data_go_jp_catalog",
          "line": 1086,
          "module_chain": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "data_go_jp_catalog",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 03:40",
          "command": "python3 -m backend.crawlers.sources.data_go_jp_catalog --rows 100 --max-pages 10 --sleep 0.25",
          "modules": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:40:00+09:00",
              "beijing": "2026-11-04T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T03:40:00+09:00",
              "beijing": "2026-11-11T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T03:40:00+09:00",
              "beijing": "2026-11-18T02:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1086,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 113,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_recall",
          "enabled": true,
          "line": 115
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 リコール情報",
      "source_url": "https://www.recall.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 162,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_recall",
          "line": 115,
          "module_chain": [
            "backend.crawlers.sources.caa_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 113,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_recall",
          "enabled": true,
          "line": 115
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 リコール情報",
      "source_url": "https://www.recall.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 162,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_recall",
          "line": 115,
          "module_chain": [
            "backend.crawlers.sources.caa_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 98,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_actions",
          "enabled": true,
          "line": 109
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 処分公表",
      "source_url": "https://www.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.caa.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_actions",
          "line": 109,
          "module_chain": [
            "backend.crawlers.sources.caa_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 98,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_actions",
          "enabled": true,
          "line": 109
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "消費者庁 処分公表",
      "source_url": "https://www.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.caa.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_actions",
          "line": 109,
          "module_chain": [
            "backend.crawlers.sources.caa_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_license_lists",
          "enabled": true,
          "line": 1146
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "source_url": "https://data.e-gov.go.jp/data/group/fsa",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx: {dynamic}",
          "symbol": "msg",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 494,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 159,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 291,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_license_lists",
          "line": 1146,
          "module_chain": [
            "backend.crawlers.sources.fsa_license_lists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_license_lists",
          "enabled": true,
          "line": 1146
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "source_url": "https://data.e-gov.go.jp/data/group/fsa",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx: {dynamic}",
          "symbol": "msg",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 494,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 159,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 291,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_license_lists",
          "line": 1146,
          "module_chain": [
            "backend.crawlers.sources.fsa_license_lists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "kaken",
      "crawler": "backend/crawlers/sources/kaken_research_projects.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 30,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaken",
          "enabled": true,
          "line": 1170
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "KAKEN 科学研究費助成事業データベース",
      "source_url": "https://kaken.nii.ac.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kaken.nii.ac.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://kaken.nii.ac.jp/ja/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 32,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaken",
          "line": 1170,
          "module_chain": [
            "backend.crawlers.sources.kaken_research_projects"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaken",
          "scheduler": "schedule.yaml",
          "cron": "55 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:55",
          "command": "python3 -m backend.crawlers.sources.kaken_research_projects --rows 100 --max-pages 10 --request-delay 0.08",
          "modules": [
            "backend.crawlers.sources.kaken_research_projects"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:55:00+09:00",
              "beijing": "2026-11-10T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:55:00+09:00",
              "beijing": "2026-11-17T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:55:00+09:00",
              "beijing": "2026-11-24T07:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1170,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "address_base_registry_files",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "address_base_registry_files",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 225,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO address_base_registry_files (\n              source_id, dataset_type, scope, scope_code, title, download_url,\n              format, content_length, etag, last_modified, official_status,\n              raw_metadata, fetched_at, updated_at\n            ) VALUES (\n              %s, %s, 'all', NULL, %s, %s,\n              'csv.zip', %s, %s, %s, 'official',\n              %s::jsonb, now(), now()\n            )\n            ON CONFLICT (download_url) DO UPDATE SET\n              content_length = EXCLUDED.content_length,\n              etag = EXCLUDED.etag,\n              last_modified = EXCLUDED.last_modified,\n              raw_metadata = EXCLUDED.raw_metadata,\n              fetched_at = EXCLUDED.fetched_at,\n              updated_at = now()\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 161,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "衆議院議員一覧",
      "source_url": "https://www.shugiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/syu/{n}giin.htm",
          "symbol": "SHUGIIN_URL_TPL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 161,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "衆議院議員一覧",
      "source_url": "https://www.shugiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/syu/{n}giin.htm",
          "symbol": "SHUGIIN_URL_TPL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "参議院議員一覧",
      "source_url": "https://www.sangiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sangiin.go.jp/japanese/joho1/kousei/giin/221/giin.htm",
          "symbol": "SANGIIN_URL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "参議院議員一覧",
      "source_url": "https://www.sangiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sangiin.go.jp/japanese/joho1/kousei/giin/221/giin.htm",
          "symbol": "SANGIIN_URL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/crawlers/sources/jetro_case_studies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jetro_case_studies",
          "enabled": true,
          "line": 1164
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ジェトロ活用事例",
      "source_url": "https://www.jetro.go.jp/case_study/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jetro.go.jp/case_study/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 33,
          "origin": "online"
        },
        {
          "url": "https://www.jetro.go.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jetro_case_studies",
          "line": 1164,
          "module_chain": [
            "backend.crawlers.sources.jetro_case_studies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jetro_case_studies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:30",
          "command": "python3 -m backend.crawlers.sources.jetro_case_studies",
          "modules": [
            "backend.crawlers.sources.jetro_case_studies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:30:00+09:00",
              "beijing": "2026-12-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:30:00+09:00",
              "beijing": "2027-01-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:30:00+09:00",
              "beijing": "2027-02-03T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1164,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 194,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 197,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "税理士懲戒処分公告",
      "source_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 194,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 197,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "税理士懲戒処分公告",
      "source_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 201,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国税庁 公示・刑事告発",
      "source_url": "https://www.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 201,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国税庁 公示・刑事告発",
      "source_url": "https://www.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 204,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "税理士情報検索",
      "source_url": "https://www.zeirishikensaku.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 204,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "税理士情報検索",
      "source_url": "https://www.zeirishikensaku.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 84,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_jidosha",
          "enabled": true,
          "line": 160
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 自動車事業者処分",
      "source_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 130,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_jidosha",
          "line": 160,
          "module_chain": [
            "backend.crawlers.sources.jidosha"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 84,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_jidosha",
          "enabled": true,
          "line": 160
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 自動車事業者処分",
      "source_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 130,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_jidosha",
          "line": 160,
          "module_chain": [
            "backend.crawlers.sources.jidosha"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 365,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_koyou_fraud",
          "enabled": true,
          "line": 581
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
          "symbol": "UMBRELLA_URL",
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_koyou_fraud",
          "line": 581,
          "module_chain": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 365,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_koyou_fraud",
          "enabled": true,
          "line": 581
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
          "symbol": "UMBRELLA_URL",
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_koyou_fraud",
          "line": 581,
          "module_chain": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 341,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n            ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 380,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_actions",
          "enabled": true,
          "line": 133
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "crawler_url_candidates": [
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "fallback",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 212,
          "origin": "online"
        },
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "landing_url",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 217,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_actions",
          "line": 133,
          "module_chain": [
            "backend.crawlers.sources.mhlw_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 380,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_actions",
          "enabled": true,
          "line": 133
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "crawler_url_candidates": [
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "fallback",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 212,
          "origin": "online"
        },
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "landing_url",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 217,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_actions",
          "line": 133,
          "module_chain": [
            "backend.crawlers.sources.mhlw_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_negative_extended",
          "enabled": true,
          "line": 923
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "NEGA_SEARCH_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/content/001913487.xlsx",
          "symbol": "RYOKOU_XLSX_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 59,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "RYOKOU_PAGE_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 243,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_negative_extended",
          "line": 923,
          "module_chain": [
            "backend.crawlers.sources.mlit_negative_extended"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_negative_extended",
          "enabled": true,
          "line": 923
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "NEGA_SEARCH_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/content/001913487.xlsx",
          "symbol": "RYOKOU_XLSX_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 59,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "RYOKOU_PAGE_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 243,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_negative_extended",
          "line": 923,
          "module_chain": [
            "backend.crawlers.sources.mlit_negative_extended"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 49,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "OFAC SDN List",
      "source_url": "https://www.treasury.gov/ofac/downloads/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 49,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "OFAC SDN List",
      "source_url": "https://www.treasury.gov/ofac/downloads/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "UN Sanctions List",
      "source_url": "https://www.un.org/securitycouncil/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "UN Sanctions List",
      "source_url": "https://www.un.org/securitycouncil/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 242,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EU Sanctions",
      "source_url": "https://www.sanctionsmap.eu/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 242,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EU Sanctions",
      "source_url": "https://www.sanctionsmap.eu/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "HMT UK Sanctions",
      "source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "HMT UK Sanctions",
      "source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 138,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmda_recall",
          "enabled": true,
          "line": 148
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "PMDA 医薬品/医療機器 回収",
      "source_url": "https://www.info.pmda.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 150,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 244,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmda_recall",
          "line": 148,
          "module_chain": [
            "backend.crawlers.sources.pmda_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 138,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmda_recall",
          "enabled": true,
          "line": 148
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "PMDA 医薬品/医療機器 回収",
      "source_url": "https://www.info.pmda.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 150,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 244,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmda_recall",
          "line": 148,
          "module_chain": [
            "backend.crawlers.sources.pmda_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/crawlers/sources/jgoodtech_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 274,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'J-GoodTech', 'J-GoodTech', 'business_matching',\n           'Organization for Small & Medium Enterprises and Regional Innovation, JAPAN',\n           %s, 'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public company profile API; import only fields exposed with publishCorp2=true.',\n             'terms_url', 'https://jgoodtech.smrj.go.jp/pub/ja/terms/'\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "jgoodtech_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jgoodtech_representative_done",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 217,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO jgoodtech_representative_done\n              (jgt_corp_mng_id, corporate_number, status, company_name, raw_name,\n               display_name, position, page_url, error, checked_at, updated_at)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, now(), now())\n            ON CONFLICT (jgt_corp_mng_id) DO UPDATE SET\n              corporate_number=EXCLUDED.corporate_number,\n              status=EXCLUDED.status,\n              company_name=EXCLUDED.company_name,\n              raw_name=EXCLUDED.raw_name,\n              display_name=EXCLUDED.display_name,\n              position=EXCLUDED.position,\n              page_url=EXCLUDED.page_url,\n              error=EXCLUDED.error,\n              checked_at=EXCLUDED.checked_at,\n              updated_at=now()\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "koeki_info_representatives",
      "crawler": "backend/scripts/import_koeki_info_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 44,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "koeki_info_representatives",
          "enabled": true,
          "line": 836
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 335,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Cabinet Office / prefectural governments', %s, 'public_html',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Official Koeki Hojin information detail pages. Corporate-number match requires unique normalized corporation name plus address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "公益法人information 公益法人等詳細",
      "source_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
      "crawler_url_candidates": [
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 415,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "koeki_info_representatives",
          "line": 836,
          "module_chain": [
            "backend.scripts.import_koeki_info_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "koeki_info_representatives",
          "scheduler": "schedule.yaml",
          "cron": "30 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:30",
          "command": "python3 -m backend.scripts.import_koeki_info_representatives --start-page 1 --max-pages 6 --disp-number 100 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_koeki_info_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:30:00+09:00",
              "beijing": "2026-11-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:30:00+09:00",
              "beijing": "2026-12-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:30:00+09:00",
              "beijing": "2027-01-09T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 836,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "entity_resolution_cache",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "entity_resolution_cache",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 657,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO entity_resolution_cache\n              (raw_name, raw_address, raw_context, resolved_corporate_number,\n               confidence, method)\n            VALUES (%s, '', %s, %s, %s, %s)\n            ON CONFLICT (raw_name, raw_address) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "court_case_intelligence",
      "crawler": "backend/scripts/run_court_case_intelligence_job.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 18,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "court_case_intelligence",
          "enabled": true,
          "line": 85
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "裁判所判例 司法・訴訟インテリジェンス",
      "source_url": "https://www.courts.go.jp/app/hanrei_jp/search1",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划"
    },
    {
      "source": "geps",
      "crawler": "backend/scripts/backfill_geps_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "geps_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "geps_representative_done",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 280,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO geps_representative_done\n              (corporate_number, status, company_name, raw_name, display_name,\n               position, error, checked_at, updated_at)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, now(), now())\n            ON CONFLICT (corporate_number) DO UPDATE SET\n              status=EXCLUDED.status,\n              company_name=EXCLUDED.company_name,\n              raw_name=EXCLUDED.raw_name,\n              display_name=EXCLUDED.display_name,\n              position=EXCLUDED.position,\n              error=EXCLUDED.error,\n              checked_at=EXCLUDED.checked_at,\n              updated_at=now()\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.p-portal.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0101",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0100",
          "symbol": "SEARCH_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0108",
          "symbol": "DETAIL_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BID_ZIP_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用"
    }
  ],
  "unresolved_sources": [
    {
      "source": "kanpou",
      "name": "官報",
      "reason": "登记 ID 6（kanpou）未找到绑定程序；已有官方官报程序明确使用 ID 17438（kanpo_official），而不是 ID 6。待确认的是旧登记的使用关系，不是官报是否已有采集实现。",
      "crawlers": [],
      "category": "同一官方站点的新旧入口",
      "url_status": "已确认跳转到同一官方站点",
      "url_summary": "实际 GET：kanpou.npb.go.jp 自动跳转到 www.kanpo.go.jp，最终 HTTP 200。官方说明新官报发行站于 2025-04-01 开设，继续提供此前官报信息。两个 URL 当前属于同一官方来源的新旧入口。Tremolo 是另一个第三方决算整理站。",
      "final_url": "https://www.kanpo.go.jp/",
      "web_evidence": [
        {
          "label": "官报旧入口（可验证跳转）",
          "url": "https://kanpou.npb.go.jp/"
        },
        {
          "label": "官方新站与迁移说明",
          "url": "https://www.kanpo.go.jp/"
        },
        {
          "label": "Tremolo 第三方服务说明",
          "url": "https://kanpo.tremolo.work/"
        }
      ],
      "candidates": [
        {
          "source": "kanpo_official",
          "crawler": "backend/crawlers/sources/kanpo_official.py",
          "tables": [
            "kanpo_issues",
            "kanpo_notices",
            "kanpo_source_records"
          ],
          "evidence_level": "online_code",
          "comparison": "同一官方站点，来源 ID 不同：代码使用 lookup_source_id(\"kanpo_official\")。可在业务层关联新旧入口；不能据此声称 ID 6 已被调用。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/kanpo_official.py",
              "line": 299,
              "kind": "source_code_assignment",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/kanpo_official.py",
              "line": 561,
              "kind": "lookup_source_id",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/kanpo_official.py",
              "line": 602,
              "kind": "source_code_argument",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/kanpo_official.py",
              "line": 663,
              "kind": "source_code_argument",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/kanpo_official.py",
              "line": 744,
              "kind": "source_code_argument",
              "origin": "online"
            }
          ]
        },
        {
          "source": "kanpo_tremolo",
          "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
          "tables": [
            "financial_statements"
          ],
          "evidence_level": "online_code",
          "comparison": "都是官报相关内容，但 Tremolo 仅自行整理决算公告，网站明确声明与官报发行/销售机构无关联；应保留为独立渠道。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/kanpo_tremolo.py",
              "line": 251,
              "kind": "source_code_assignment",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/kanpo_tremolo.py",
              "line": 275,
              "kind": "lookup_source_id",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "网站层面的新旧入口关系已确认；数据库旧登记的绑定或历史使用仍未确认。",
      "next_check": "如需合并业务来源，可把 kanpou 标注为 kanpo_official 的旧网站入口；数据库 ID 是否迁移、停用或合并需另查历史记录。",
      "source_id": 6,
      "registered_url": "https://kanpou.npb.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://kanpou.npb.go.jp/",
        "checked_at": "2026-11-02T09:05:33.906417+00:00",
        "status": 200,
        "final_url": "https://www.kanpo.go.jp/",
        "content_type": "text/html",
        "title": "官報",
        "read_bytes": 87501,
        "sha256": "acb2b0276a51ad328bac7da856dd20684ddd9ba6cc5c7ea8d9b7582ccd76e788",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": [
          {
            "from": "https://kanpou.npb.go.jp/",
            "status": 301,
            "to": "https://www.kanpo.go.jp/"
          }
        ]
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "estat",
      "name": "e-Stat 政府統計",
      "reason": "登记 ID 7 的 estat 在当前可读代码中只发现来源初始化登记，没有找到使用该 source code 的采集程序、调度入口或完整写表链路。",
      "crawlers": [],
      "category": "网站可用，未找到对应实现",
      "url_status": "HTTP 200，官方统计 API 说明页可读",
      "url_summary": "e-Stat API 官方页面可访问，提供机器可读统计数据，说明 API 使用需要用户登记。页面可用不等于项目已配置账号或已调用 API；本次没有调用带认证的统计接口。",
      "final_url": "https://www.e-stat.go.jp/api/",
      "web_evidence": [
        {
          "label": "e-Stat API 官方说明",
          "url": "https://www.e-stat.go.jp/api/"
        }
      ],
      "candidates": [
        {
          "source": "reinfolib",
          "crawler": "backend/crawlers/sources/reinfolib.py",
          "tables": [
            "population_mesh_250m",
            "station_passengers",
            "land_prices",
            "real_estate_transactions"
          ],
          "evidence_level": "online_code",
          "comparison": "同属区域统计/地理相关数据，但该程序请求国交省不动产信息库，不是 e-Stat API；不能把它视为 estat 的替代或完整覆盖。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/reinfolib.py",
              "line": 119,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "仅发现领域相近的数据程序，没有证据确认 e-Stat 本身已接入。",
      "next_check": "明确需要哪些 e-Stat 统计表，再检查既有程序的数据来源和字段覆盖；不能以网站可访问或 API Key 字段存在来推断实现状态。",
      "source_id": 7,
      "registered_url": "https://www.e-stat.go.jp/api/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://www.e-stat.go.jp/api/",
        "checked_at": "2026-11-02T09:05:38.113030+00:00",
        "status": 200,
        "final_url": "https://www.e-stat.go.jp/api/",
        "content_type": "text/html; charset=UTF-8",
        "title": "政府統計の総合窓口(e-Stat)−API機能 | 政府統計の総合窓口(e-Stat)−API機能",
        "read_bytes": 37592,
        "sha256": "7141846c1108a9becebbaa156475fe87c0025cf52019c19024dd6227b43714e5",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "data_go_jp",
      "name": "DATA.GO.JP",
      "reason": "旧登记 ID 8（data_go_jp）未找到直接绑定；现已读取线上 data_go_jp_catalog.py，代码使用新登记 data_go_jp_catalog（ID 18976），并非旧 ID。",
      "crawlers": [],
      "category": "同一数据平台，另有来源编号",
      "url_status": "门户与目录 API 均返回 HTTP 200",
      "url_summary": "登记首页跳转到 data.e-gov.go.jp/info/ja。与现有目录 crawler 相同平台的 CKAN package_search 接口用 rows=0 验证，返回 success=true，未下载数据记录。这证明门户与 API 属于同一目录平台，不证明项目实际入库或覆盖全部数据集。",
      "final_url": "https://data.e-gov.go.jp/info/ja",
      "web_evidence": [
        {
          "label": "e-Gov 数据门户",
          "url": "https://data.e-gov.go.jp/"
        },
        {
          "label": "目录 API，只查询元数据响应",
          "url": "https://data.e-gov.go.jp/data/api/3/action/package_search?rows=0"
        },
        {
          "label": "门户官方说明",
          "url": "https://data.e-gov.go.jp/info/ja/about-site"
        }
      ],
      "candidates": [
        {
          "source": "data_go_jp_catalog",
          "crawler": "backend/crawlers/sources/data_go_jp_catalog.py",
          "tables": [
            "external_data_source_discoveries"
          ],
          "evidence_level": "online_code",
          "comparison": "同一平台的目录发现程序；线上代码使用 data_go_jp_catalog，请求 package_search 并写入数据集发现表。只采集目录／资源线索，不等于已采集每个数据集正文，也不证明旧 source ID 被调用。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/data_go_jp_catalog.py",
              "line": 29,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "网站平台重合已确认，存在新来源编号的候选链路；旧 ID 的使用关系仍未确认。",
      "next_check": "读取线上 data_go_jp_catalog.py 或核查其入库记录，确认实际 source_id 和采集范围，再决定是否标注旧登记为别名。",
      "source_id": 8,
      "registered_url": "https://data.e-gov.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://data.e-gov.go.jp/",
        "checked_at": "2026-11-02T09:05:33.905658+00:00",
        "status": 200,
        "final_url": "https://data.e-gov.go.jp/info/ja",
        "content_type": "text/html; charset=UTF-8",
        "title": "トップ | e-Govデータポータル",
        "read_bytes": 34933,
        "sha256": "b3cb285cae6f378fd491ccc2c64f1d47069ac910452d6d5e8a0503967c42fdbb",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": [
          {
            "from": "https://data.e-gov.go.jp/",
            "status": 301,
            "to": "https://data.e-gov.go.jp/info/ja"
          }
        ]
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "resas",
      "name": "RESAS API",
      "reason": "未找到绑定 resas 的项目采集入库实现；进一步联网核查发现，该登记指向的旧 RESAS API 已被官方公告停止提供。",
      "crawlers": [],
      "category": "官方 API 已停止服务",
      "url_status": "说明页可访问，但官方明确宣布 API 停服",
      "url_summary": "首页和 API 文档返回 HTTP 200。文档明确写明：RESAS API 所有服务于 2025-03-24 结束提供，2024-10-31 已停止新账户登记。因此 HTTP 200 只是文档仍可访问，不代表 API 服务仍可用。",
      "final_url": "https://opendata.resas-portal.go.jp/docs/api/v1/index.html",
      "web_evidence": [
        {
          "label": "RESAS 官方停服公告与替代数据说明",
          "url": "https://opendata.resas-portal.go.jp/docs/api/v1/index.html"
        }
      ],
      "candidates": [
        {
          "source": "reinfolib",
          "crawler": "backend/crawlers/sources/reinfolib.py",
          "tables": [
            "real_estate_transactions",
            "land_prices",
            "population_mesh_250m"
          ],
          "evidence_level": "online_code",
          "comparison": "官方停服公告列出的部分替代渠道包括不动产信息库；项目已有该 API 的采集实现。但它只覆盖部分相关数据，不能当成整个 RESAS 的同源或完整替代。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/reinfolib.py",
              "line": 119,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "确认存在来源服务状态变化；不应把 resas 继续当作已可用的旧 API 接口。没有改动线上登记状态。",
      "next_check": "按业务需要逐项匹配官方公告中的替代数据渠道，另行决定是否把此登记标为历史/停服。",
      "source_id": 9,
      "registered_url": "https://opendata.resas-portal.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://opendata.resas-portal.go.jp/",
        "checked_at": "2026-11-02T09:05:33.906552+00:00",
        "status": 200,
        "final_url": "https://opendata.resas-portal.go.jp/",
        "content_type": "text/html",
        "title": "RESAS-API - 地域経済分析システム（RESAS）のAPI提供情報",
        "read_bytes": 5966,
        "sha256": "01420445ca2f81ee1d1513a4d66ad49c7153629fc8f84e5bb49f1b9e36e75665",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "nichibenren",
      "name": "日弁連 弁護士検索",
      "reason": "nichibenren 这条登记未找到直接绑定；现有 bengoshikai.py 使用独立的 bengoshikai 来源编号和网站，不是直接使用 nichibenren 的登记 ID。",
      "crawlers": [],
      "category": "官方导航关联，相关数据不完全等价",
      "url_status": "直接 HTTP GET 200，搜索页明确链接现有 crawler 站点",
      "url_summary": "日弁连搜索页实际可读，并同时链接 member.nichibenren.or.jp/general_search 和 www.bengoshikai.jp（ひまわりサーチ）。部分网页读取工具返回 412，直接 HTTP GET 能读取页面。律师基本信息搜索与自愿登记的ひまわりサーチ是相关但不同的服务，覆盖范围不可直接等同。",
      "final_url": "https://www.nichibenren.or.jp/search.html",
      "web_evidence": [
        {
          "label": "日弁连官方搜索导航页",
          "url": "https://www.nichibenren.or.jp/search.html"
        },
        {
          "label": "爱知县律师协会对两种查询的说明",
          "url": "https://www.aiben.jp/jouhou/"
        },
        {
          "label": "ひまわりサーチ",
          "url": "https://www.bengoshikai.jp/"
        }
      ],
      "candidates": [
        {
          "source": "bengoshikai",
          "crawler": "backend/crawlers/sources/bengoshikai.py",
          "tables": [
            "professionals"
          ],
          "evidence_level": "online_code",
          "comparison": "官方导航确实指向该程序抓取的站点，所以不是仅凭名称推测。但ひまわりサーチ提供自愿登记的业务领域等信息，不能据此证明覆盖日弁连全部律师基本信息。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/bengoshikai.py",
              "line": 272,
              "kind": "source_code_assignment",
              "origin": "online"
            },
            {
              "file": "backend/crawlers/sources/bengoshikai.py",
              "line": 298,
              "kind": "lookup_source_id",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "已有直接相关的律师信息 crawler；应标注服务关联及覆盖差异，不能直接合并两个来源 ID。",
      "next_check": "核对需要的是全体律师基本名录还是自愿披露的业务资料，并比较登记号/人员集合，确认是否存在覆盖缺口。",
      "source_id": 31,
      "registered_url": "https://www.nichibenren.or.jp/search.html",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://www.nichibenren.or.jp/search.html",
        "checked_at": "2026-11-02T09:05:39.825069+00:00",
        "status": 200,
        "final_url": "https://www.nichibenren.or.jp/search.html",
        "content_type": "text/html",
        "title": "弁護士検索｜日本弁護士連合会",
        "read_bytes": 14872,
        "sha256": "6c90212c5b157c2d148c6871e398522b60c1a733e462bf8b70533207afb960bb",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "jicpa",
      "name": "公認会計士検索",
      "reason": "登记 ID 34（jicpa）未找到程序使用；已确认 jicpa_registry.py 使用 SOURCE_CODE=\"jicpa_registry\"（ID 123），写入 professionals。",
      "crawlers": [],
      "category": "同一网站，实际程序使用另一编号",
      "url_status": "同域搜索系统可访问，HTTP 200",
      "url_summary": "登记根地址返回 HTTP 200，但没有可读页面正文；程序使用的同域 /cpa_search/ 能正常显示日本注册会计师协会的公认会计士及审计法人搜索系统。网站归属和业务内容一致；未观察到根地址自动跳转，不能称为已确认的域名迁移。",
      "final_url": "https://registry.jicpa.or.jp/cpa_search/",
      "web_evidence": [
        {
          "label": "登记根地址",
          "url": "https://registry.jicpa.or.jp/"
        },
        {
          "label": "实际搜索系统",
          "url": "https://registry.jicpa.or.jp/cpa_search/"
        }
      ],
      "candidates": [
        {
          "source": "jicpa_registry",
          "crawler": "backend/crawlers/sources/jicpa_registry.py",
          "tables": [
            "professionals"
          ],
          "evidence_level": "online_code",
          "comparison": "同一机构、同一网站的实际采集入口；问题主要在 source 编号不同，而不是没有相关 crawler。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/jicpa_registry.py",
              "line": 104,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "已确认同站点已有相关采集实现；未确认旧 ID 34 的使用或与 ID 123 的历史归并。",
      "next_check": "如需业务来源归并，可关联 jicpa 与 jicpa_registry；是否迁移旧数据应另查引用和历史记录。",
      "source_id": 34,
      "registered_url": "https://registry.jicpa.or.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://registry.jicpa.or.jp/",
        "checked_at": "2026-11-02T09:05:35.528107+00:00",
        "status": 200,
        "final_url": "https://registry.jicpa.or.jp/",
        "content_type": "text/html; charset=UTF-8",
        "title": null,
        "read_bytes": 0,
        "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "courts",
      "name": "裁判所 判例検索",
      "reason": "登记 ID 38（courts）未找到直接绑定；现有程序以 courts_hanrei（ID 124）登记并写表。",
      "crawlers": [],
      "category": "同一法院网站，程序使用另一编号",
      "url_status": "法院官网 HTTP 200，同站点已有判例程序",
      "url_summary": "登记网站是日本法院官网，主页提供裁判例检索入口。courts_hanrei.py 的 BASE 也是 www.courts.go.jp，使用 /hanrei/search{form}/index.html。能够确认是同一网站与同类判例业务，不能据此声称旧 ID 38 被调用。",
      "final_url": "https://www.courts.go.jp/",
      "web_evidence": [
        {
          "label": "日本法院官网",
          "url": "https://www.courts.go.jp/"
        },
        {
          "label": "法院判例栏目",
          "url": "https://www.courts.go.jp/hanrei/index.html"
        }
      ],
      "candidates": [
        {
          "source": "courts_hanrei",
          "crawler": "backend/crawlers/sources/courts_hanrei.py",
          "tables": [
            "risk_events"
          ],
          "evidence_level": "online_code",
          "comparison": "已有同站点判例采集实现，SOURCE_CODE 为 courts_hanrei。是否已采全、当前请求是否成功需运行记录验证，不在本次结论内。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/courts_hanrei.py",
              "line": 46,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "已确认相同法院网站存在独立来源编号的采集链路，旧登记没有直接绑定。",
      "next_check": "核查两个登记的历史引用后，决定在业务视图中关联还是保留独立标签。",
      "source_id": 38,
      "registered_url": "https://www.courts.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://www.courts.go.jp/",
        "checked_at": "2026-11-02T09:05:37.652656+00:00",
        "status": 200,
        "final_url": "https://www.courts.go.jp/",
        "content_type": null,
        "title": "裁判所 - Courts in Japan",
        "read_bytes": 60196,
        "sha256": "9e94980ce14c2425678ec58a0130b849a80b5e652cb25083fe05249eb3b7f774",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "ip_courts",
      "name": "知的財産高等裁判所",
      "reason": "未找到绑定 ip_courts 的专用程序；进一步检查发现其官网已迁移到法院主站，现有通用判例程序有知财检索分支，但未核实该分支的实际运行与覆盖。",
      "crawlers": [],
      "category": "网站迁移，现有程序具备相关分支",
      "url_status": "旧域名跳转至法院主站知财栏目",
      "url_summary": "www.ip.courts.go.jp 自动跳转到 www.courts.go.jp/ip/，HTTP 200。知财官方判例页链接 /hanrei/search7/index.html?view=chizai；本次继续访问该检索链接时显示维护页，所以不能据首页可访问就认定检索正常。",
      "final_url": "https://www.courts.go.jp/ip/",
      "web_evidence": [
        {
          "label": "旧知财高裁域名（可验证跳转）",
          "url": "https://www.ip.courts.go.jp/"
        },
        {
          "label": "知财高裁判例页",
          "url": "https://www.courts.go.jp/ip/hanrei/index.html"
        },
        {
          "label": "官方链接的知财检索入口",
          "url": "https://www.courts.go.jp/hanrei/search7/index.html?view=chizai"
        }
      ],
      "candidates": [
        {
          "source": "courts_hanrei",
          "crawler": "backend/crawlers/sources/courts_hanrei.py",
          "tables": [
            "risk_events"
          ],
          "evidence_level": "online_code",
          "comparison": "线上代码支持 --form 7 --court-case-type \"6 7\" 的知财检索；默认调度只给 --pages-max 50，使用默认 form=1。具备知财分支不等于已验证该分支运行成功或已覆盖全部知财判例。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/courts_hanrei.py",
              "line": 46,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "已确认网址迁移和现有程序的知财能力；实际知财数据覆盖仍待核实。",
      "next_check": "检查 courts_hanrei 的运行参数、知财子分类和对应记录来源，验证具体覆盖，不根据泛法院来源直接宣称已覆盖。",
      "source_id": 39,
      "registered_url": "https://www.ip.courts.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://www.ip.courts.go.jp/",
        "checked_at": "2026-11-02T09:05:39.519707+00:00",
        "status": 200,
        "final_url": "https://www.courts.go.jp/ip/",
        "content_type": null,
        "title": "知的財産高等裁判所",
        "read_bytes": 30718,
        "sha256": "0841778387f2165cb191706f142579405cb4769e2f79a0ce58618f04735c168e",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": false,
          "package_search": false,
          "success": false
        },
        "redirects": [
          {
            "from": "https://www.ip.courts.go.jp/",
            "status": 301,
            "to": "https://www.courts.go.jp/ip/"
          }
        ]
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    },
    {
      "source": "jplatpat",
      "name": "J-PlatPat",
      "reason": "field_lineage 声称 jplatpat 通过 gbizinfo_html.py 的 target 05 写知财表，但当前该文件没有对应知财写入实现，声明与代码不符。现有相关程序使用 gbizinfo 或 jpo_ip_api 等其他 source code。",
      "crawlers": [],
      "category": "已有相关知识产权程序，证据存在差异",
      "url_status": "HTTP 200，首页是 JavaScript 应用入口",
      "url_summary": "登记网站返回 HTTP 200，文本读取仅显示 Loading，不能据此判定无服务。INPIT/特许厅官方说明确认它是特许、实用新案、意匠、商标等信息的检索平台。官方 JPO API 站 ip-data.jpo.go.jp 是另一访问渠道，不是 J-PlatPat 网页的简单别名。",
      "final_url": "https://www.j-platpat.inpit.go.jp/",
      "web_evidence": [
        {
          "label": "J-PlatPat 网页入口",
          "url": "https://www.j-platpat.inpit.go.jp/"
        },
        {
          "label": "INPIT 官方平台说明",
          "url": "https://www.inpit.go.jp/j-platpat_info/index.html"
        },
        {
          "label": "JPO 官方 API 信息站",
          "url": "https://ip-data.jpo.go.jp/"
        }
      ],
      "candidates": [
        {
          "source": "gbizinfo",
          "crawler": "backend/crawlers/sources/gbizinfo_full.py",
          "tables": [
            "intellectual_properties"
          ],
          "evidence_level": "online_code",
          "comparison": "线上 gbizinfo_full.py 的 target 05 实现了知财数据写入，但来源是 gBizINFO，不能把它写成 jplatpat ID 的直接调用；也不能据此保证字段与历史范围完全相同。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/gbizinfo_full.py",
              "line": 600,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        },
        {
          "source": "jpo_ip_api",
          "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
          "tables": [
            "jpo_trademark_enrichment",
            "company_ip_profile",
            "intellectual_properties"
          ],
          "evidence_level": "online_code",
          "comparison": "已读取线上实现，支持官方 JPO API 与 jplatpat-public 查询模式，绑定 jpo_ip_api。主要为商标补充，不等于完整专利／意匠／商标覆盖。直接调度配置停用，不能认定当前已启用或最近采集成功。",
          "evidence": [
            {
              "file": "backend/crawlers/sources/jpo_trademark_api.py",
              "line": 47,
              "kind": "source_code_assignment",
              "origin": "online"
            }
          ]
        }
      ],
      "conclusion": "确认存在同领域采集实现；J-PlatPat 直接来源绑定、运行状态与数据覆盖仍未确认。",
      "next_check": "先复核线上 JPO 模块及其启用状态，再核对知财表中实际 source_id；修正过时字段声明应另行处理。",
      "source_id": 40,
      "registered_url": "https://www.j-platpat.inpit.go.jp/",
      "checked_at": "2026-11-02T09:09:20.155046+00:00",
      "http_check": {
        "url": "https://www.j-platpat.inpit.go.jp/",
        "checked_at": "2026-11-02T09:05:39.780791+00:00",
        "status": 200,
        "final_url": "https://www.j-platpat.inpit.go.jp/",
        "content_type": "text/html; charset=UTF-8",
        "title": "j-platpat",
        "read_bytes": 57604,
        "sha256": "911ecac77bb2f542cd41b01c8855a004a4b61238fc839ce243f0103e7c09cbc5",
        "observations": {
          "2025年3月24日": false,
          "E-0109": false,
          "cpa_search": false,
          "Loading": true,
          "package_search": false,
          "success": false
        },
        "redirects": []
      },
      "web_links_checked_at": "2026-11-02T09:09:20.155046+00:00"
    }
  ],
  "excluded_relationships": [
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_issues",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_issues",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 373,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_issues (\n            issue_date, issue_kind, issue_kind_code, issue_no, edition_key,\n            fullcontents_url, source_id, source_payload, fetched_at, updated_at\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb, now(), now())\n        ON CONFLICT (issue_date, issue_kind, issue_no)\n        DO UPDATE SET\n            fullcontents_url = COALESCE(EXCLUDED.fullcontents_url, kanpo_issues.fullcontents_url),\n            source_payload = kanpo_issues.source_payload || EXCLUDED.source_payload,\n            updated_at = now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "review_excluded": "Issue rows use official_source_id, not govbook_source_id (kanpo_official.py:682-689)"
    }
  ],
  "unmapped_crawler_modules": [
    {
      "crawler": "backend/crawlers/sources/trustart_redata_public.py",
      "origin": "online",
      "reason": "竞争产品公开页面调研；输出JSON，不写kaisha_db；SOURCE_CODE未登记"
    }
  ],
  "shared_sources": [
    {
      "source": "company_geocode",
      "crawlers": [
        "backend/scripts/geocode_companies.py",
        "backend/scripts/geocode_companies_parallel.py"
      ]
    },
    {
      "source": "company_website_data",
      "crawlers": [
        "backend/scripts/backfill_officers_from_website.py",
        "backend/scripts/run_phase4_v3_subpages.py",
        "backend/scripts/run_phase4_website_scraper.py"
      ]
    },
    {
      "source": "courts_hanrei",
      "crawlers": [
        "backend/crawlers/sources/courts_hanrei.py",
        "backend/scripts/parse_courts_hanrei_pdfs.py"
      ]
    },
    {
      "source": "edinet",
      "crawlers": [
        "backend/crawlers/sources/edinet.py",
        "backend/crawlers/sources/edinet_business_purpose.py",
        "backend/crawlers/sources/edinet_filings.py",
        "backend/crawlers/sources/edinet_xbrl.py",
        "backend/scripts/backfill_en_name_from_edinet.py",
        "backend/scripts/backfill_establishment_from_edinet.py",
        "backend/scripts/fetch_edinet_shareholders.py",
        "backend/scripts/fetch_edinet_subsidiaries.py",
        "backend/scripts/import_edinet_codelist.py"
      ]
    },
    {
      "source": "env_sanpai",
      "crawlers": [
        "backend/crawlers/sources/env_sanpai.py",
        "backend/scripts/backfill_industry_from_env_sanpai.py"
      ]
    },
    {
      "source": "gbizinfo",
      "crawlers": [
        "backend/crawlers/sources/gbizinfo.py",
        "backend/crawlers/sources/gbizinfo_full.py",
        "backend/scripts/backfill_representative.py",
        "backend/scripts/import_gbizinfo_json_representatives.py"
      ]
    },
    {
      "source": "gbizinfo_html",
      "crawlers": [
        "backend/crawlers/sources/gbizinfo_html.py",
        "backend/scripts/backfill_officers_from_gbizinfo_html.py",
        "backend/scripts/refetch_missing_gbizinfo_html.py",
        "backend/scripts/run_gbizinfo_html_batch.py",
        "backend/scripts/run_gbizinfo_html_batch_expanded.py",
        "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py"
      ]
    },
    {
      "source": "geps",
      "crawlers": [
        "backend/crawlers/sources/geps.py",
        "backend/scripts/backfill_geps_representatives.py"
      ]
    },
    {
      "source": "jetro_case_studies",
      "crawlers": [
        "backend/crawlers/sources/jetro_case_studies.py",
        "backend/scripts/import_jetro_representatives.py"
      ]
    },
    {
      "source": "jgoodtech",
      "crawlers": [
        "backend/crawlers/sources/jgoodtech_profiles.py",
        "backend/scripts/import_jgoodtech_representatives.py"
      ]
    },
    {
      "source": "kanpo_official",
      "crawlers": [
        "backend/crawlers/sources/kanpo_official.py",
        "backend/scripts/backfill_kanpo_insolvency_risk_events.py"
      ]
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawlers": [
        "backend/crawlers/sources/mhlw_koyou_fraud.py",
        "backend/scripts/import_public_representative_clues.py"
      ]
    },
    {
      "source": "mlit_negative",
      "crawlers": [
        "backend/crawlers/sources/mlit.py",
        "backend/crawlers/sources/mlit_negative_extended.py"
      ]
    },
    {
      "source": "npo_houjin",
      "crawlers": [
        "backend/crawlers/sources/npo.py",
        "backend/crawlers/sources/npo_facilities.py",
        "backend/scripts/import_npo_representatives.py"
      ]
    },
    {
      "source": "nta_houjin_api_v1",
      "crawlers": [
        "backend/scripts/import_houjin_via_api.py",
        "backend/scripts/nta_history_backfill.py"
      ]
    },
    {
      "source": "reinfolib",
      "crawlers": [
        "backend/crawlers/sources/reinfolib.py",
        "backend/scripts/reinfolib_incremental.py"
      ]
    },
    {
      "source": "seiji_shikin",
      "crawlers": [
        "backend/crawlers/sources/seiji_shikin.py",
        "backend/crawlers/sources/seiji_shikin_donors.py"
      ]
    }
  ],
  "shared_crawlers": [
    {
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "sources": [
        "caa_no_trouble",
        "fcg_incidents",
        "meti_foreign_user_list",
        "npa_designated_boryokudan",
        "npa_wanted",
        "pref_boryokudan_exclusion",
        "prefectural_police_wanted",
        "psia_terror_orgs",
        "shizuoka_boryokudan_public_notice",
        "yakuza_news",
        "yakuza_wiki"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/diet.py",
      "sources": [
        "diet_sangiin",
        "diet_shugiin"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "sources": [
        "doj_fcpa",
        "eu_antitrust",
        "ofac_indirect",
        "sec_aaer",
        "uk_fca"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "sources": [
        "crypto_registry",
        "fsa_registry",
        "loan_registry"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "sources": [
        "jfsa_loan_actions",
        "jsda_actions",
        "jvcea_actions",
        "pcaj_actions",
        "retpc_actions",
        "seiho_actions",
        "sonpo_actions",
        "t2fifa_actions",
        "toushin_actions",
        "zenginkyo_actions",
        "zentaku_actions"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "sources": [
        "govbook_kanpo_index",
        "kanpo_official"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "sources": [
        "kenko_keiei_meigara",
        "nadeshiko_meigara"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/sanctions.py",
      "sources": [
        "eu_sanctions",
        "ofac_sdn",
        "uk_sanctions",
        "un_sanctions"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "sources": [
        "job_placement_registry",
        "temp_staffing_registry"
      ]
    },
    {
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "sources": [
        "nta_taino",
        "zeirishi",
        "zeirishi_chokai"
      ]
    },
    {
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "sources": [
        "mlit_chintai_management",
        "mlit_jutaku_shukuhaku_management",
        "mlit_mansion_management"
      ]
    }
  ],
  "unresolved_review_checked_at": "2026-11-02T09:09:20.155046+00:00",
  "schedule_catalog": [
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "aichi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_aichi_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "aomori_alis_supporter",
      "crawler": "backend/scripts/import_aomori_alis_supporter_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "aomori_sanpai_association_members",
      "crawler": "backend/scripts/import_aomori_sanpai_association_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "chiba_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_chiba_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.geocode_companies_parallel",
            "backend.scripts.geocode_companies"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "company_location_profile",
      "crawler": "backend/scripts/derive_company_location_profiles.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/run_phase4_v3_subpages.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "phase4_subpages",
          "scheduler": "schedule.yaml",
          "cron": "30 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:30",
          "command": "python3 -m backend.scripts.run_phase4_v3_subpages --daily-shard",
          "modules": [
            "backend.scripts.run_phase4_v3_subpages"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:30:00+09:00",
              "beijing": "2026-11-04T01:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:30:00+09:00",
              "beijing": "2026-11-05T01:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:30:00+09:00",
              "beijing": "2026-11-06T01:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 271,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/run_phase4_website_scraper.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "phase4_homepage",
          "scheduler": "schedule.yaml",
          "cron": "0 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:00",
          "command": "python3 -m backend.scripts.run_phase4_website_scraper",
          "modules": [
            "backend.scripts.run_phase4_website_scraper"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:00:00+09:00",
              "beijing": "2026-11-04T01:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:00:00+09:00",
              "beijing": "2026-11-05T01:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:00:00+09:00",
              "beijing": "2026-11-06T01:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 265,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "court_case_intelligence",
      "crawler": "backend/scripts/run_court_case_intelligence_job.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/crawlers/sources/courts_hanrei.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "courts_hanrei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:00",
          "command": "python3 -m backend.crawlers.sources.courts_hanrei --pages-max 50",
          "modules": [
            "backend.crawlers.sources.courts_hanrei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:00:00+09:00",
              "beijing": "2026-11-05T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:00:00+09:00",
              "beijing": "2026-11-06T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 73,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "data_go_jp_catalog",
      "crawler": "backend/crawlers/sources/data_go_jp_catalog.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "data_go_jp_catalog",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 03:40",
          "command": "python3 -m backend.crawlers.sources.data_go_jp_catalog --rows 100 --max-pages 10 --sleep 0.25",
          "modules": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:40:00+09:00",
              "beijing": "2026-11-04T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T03:40:00+09:00",
              "beijing": "2026-11-11T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T03:40:00+09:00",
              "beijing": "2026-11-18T02:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1086,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_business_purpose.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_establishment_from_edinet.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tyc-establishment-edinet.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 04:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.backfill_establishment_from_edinet --incremental",
          "modules": [
            "backend.scripts.backfill_establishment_from_edinet"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+00:00",
              "beijing": "2026-11-04T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+00:00",
              "beijing": "2026-11-05T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+00:00",
              "beijing": "2026-11-06T12:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-establishment-edinet.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 04:30:00 UTC ; next_elapse=Wed 2026-11-04 04:30:00 UTC }\nNextElapseUSecRealtime=Wed 2026-11-04 04:30:00 UTC\nLastTriggerUSec=Tue 2026-11-03 04:30:01 UTC\nId=tyc-establishment-edinet.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_shareholders.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_shareholders",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.scripts.fetch_edinet_shareholders",
          "modules": [
            "backend.scripts.fetch_edinet_shareholders"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 318,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_subsidiaries.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_subsidiaries",
          "scheduler": "schedule.yaml",
          "cron": "0 10 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 10:00",
          "command": "python3 -m backend.scripts.fetch_edinet_subsidiaries",
          "modules": [
            "backend.scripts.fetch_edinet_subsidiaries"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T10:00:00+09:00",
              "beijing": "2026-12-01T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T10:00:00+09:00",
              "beijing": "2027-01-01T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T10:00:00+09:00",
              "beijing": "2027-02-01T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 331,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/import_edinet_codelist.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "edinet_foreign_capital_derived",
      "crawler": "backend/scripts/derive_foreign_capital.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_foreign_capital_derived",
          "scheduler": "schedule.yaml",
          "cron": "30 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:30",
          "command": "python3 -m backend.scripts.derive_foreign_capital",
          "modules": [
            "backend.scripts.derive_foreign_capital"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:30:00+09:00",
              "beijing": "2026-12-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:30:00+09:00",
              "beijing": "2027-01-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:30:00+09:00",
              "beijing": "2027-02-01T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 337,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "egov_law",
      "crawler": "backend/crawlers/sources/egov_law.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "egov_law",
          "scheduler": "schedule.yaml",
          "cron": "0 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:00",
          "command": "python3 -m backend.crawlers.sources.egov_law",
          "modules": [
            "backend.crawlers.sources.egov_law"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:00:00+09:00",
              "beijing": "2026-11-04T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:00:00+09:00",
              "beijing": "2026-11-05T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:00:00+09:00",
              "beijing": "2026-11-06T16:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1057,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ehime_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ehime_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "enecho_retail_electric",
      "crawler": "backend/scripts/import_enecho_retail_electric_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "enecho_retail_electric",
          "scheduler": "schedule.yaml",
          "cron": "0 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:00",
          "command": "python3 -m backend.scripts.import_enecho_retail_electric_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:00:00+09:00",
              "beijing": "2026-11-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:00:00+09:00",
              "beijing": "2026-12-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:00:00+09:00",
              "beijing": "2027-01-08T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 740,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "enecho_retail_gas",
      "crawler": "backend/scripts/import_enecho_retail_gas_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "enecho_retail_gas",
          "scheduler": "schedule.yaml",
          "cron": "20 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:20",
          "command": "python3 -m backend.scripts.import_enecho_retail_gas_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:20:00+09:00",
              "beijing": "2026-11-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:20:00+09:00",
              "beijing": "2026-12-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:20:00+09:00",
              "beijing": "2027-01-08T04:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 752,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/crawlers/sources/env_sanpai.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "env_sanpai",
          "scheduler": "schedule.yaml",
          "cron": "50 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:50",
          "command": "python3 -m backend.crawlers.sources.env_sanpai",
          "modules": [
            "backend.crawlers.sources.env_sanpai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:50:00+09:00",
              "beijing": "2026-11-04T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:50:00+09:00",
              "beijing": "2026-11-05T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:50:00+09:00",
              "beijing": "2026-11-06T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 139,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fsa_money_lender",
      "crawler": "backend/scripts/import_fsa_money_lender_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "fsa_money_lender",
          "scheduler": "schedule.yaml",
          "cron": "40 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:40",
          "command": "python3 -m backend.scripts.import_fsa_money_lender_reps --download --apply",
          "modules": [
            "backend.scripts.import_fsa_money_lender_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:40:00+09:00",
              "beijing": "2026-11-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:40:00+09:00",
              "beijing": "2026-12-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:40:00+09:00",
              "beijing": "2027-01-08T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 770,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "fukui_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_fukui_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "fukuoka_medical_corporation_reports",
      "crawler": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/backfill_representative.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/import_gbizinfo_json_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "gifu_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_gifu_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "gunma_medical_corporation_reports",
      "crawler": "backend/scripts/import_gunma_medical_corporation_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "gunma_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "30 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:30",
          "command": "python3 -m backend.scripts.import_gunma_medical_corporation_reps --max-zips 6 --max-pdfs 600 --ocr-missing --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:30:00+09:00",
              "beijing": "2027-01-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:30:00+09:00",
              "beijing": "2027-04-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:30:00+09:00",
              "beijing": "2027-07-10T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 902,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "hanshin_expressway_qualified_suppliers",
      "crawler": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "hirakata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_hirakata_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "hojyokin_portal",
      "crawler": "backend/crawlers/sources/hojyokin_portal.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "scheduler": "schedule.yaml",
          "cron": "35 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 03:35",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --max-pages-per-pref 20 --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 689,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "weekly",
          "label": "每周一 03:40",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 696,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 04:10",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --include-ended --list-snapshot-only --sleep 1.0 --list-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 480,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T04:10:00+09:00",
              "beijing": "2026-11-10T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T04:10:00+09:00",
              "beijing": "2026-11-17T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T04:10:00+09:00",
              "beijing": "2026-11-24T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 703,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "scheduler": "schedule.yaml",
          "cron": "55 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:55",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --snapshot-detail-limit 500 --sleep 1.0 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:55:00+09:00",
              "beijing": "2026-11-04T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:55:00+09:00",
              "beijing": "2026-11-05T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:55:00+09:00",
              "beijing": "2026-11-06T03:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 709,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ibaraki_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "imaj_advice_disclosure",
      "crawler": "backend/scripts/import_imaj_advice_disclosure_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "imaj_advice_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "40 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:40",
          "command": "python3 -m backend.scripts.import_imaj_advice_disclosure_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:40:00+09:00",
              "beijing": "2026-11-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:40:00+09:00",
              "beijing": "2026-12-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:40:00+09:00",
              "beijing": "2027-01-08T09:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 818,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "imaj_investment_management_disclosure",
      "crawler": "backend/scripts/import_imaj_investment_management_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "imaj_investment_management_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "10 11 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 11:10",
          "command": "python3 -m backend.scripts.import_imaj_investment_management_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_investment_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T11:10:00+09:00",
              "beijing": "2026-11-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T11:10:00+09:00",
              "beijing": "2026-12-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T11:10:00+09:00",
              "beijing": "2027-01-08T10:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 824,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "invoice_kohyo",
      "crawler": "backend/crawlers/sources/invoice_kohyo.py",
      "coverage": "configured_disabled",
      "plans": [
        {
          "task": "invoice_kohyo_monthly",
          "scheduler": "schedule.yaml",
          "cron": "30 21 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "monthly",
          "label": "每月 1 日 21:30",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode monthly",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 395,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "invoice_kohyo_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 22:00",
          "command": "python3 -m backend.crawlers.sources.invoice_kohyo --mode daily",
          "modules": [
            "backend.crawlers.sources.invoice_kohyo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 401,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "invoice_kohyo_api_v1",
      "crawler": "backend/scripts/import_invoice_via_api.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "invoice_kohyo_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 22:30",
          "command": "python3 -m backend.scripts.import_invoice_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_invoice_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T22:30:00+09:00",
              "beijing": "2026-11-03T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T22:30:00+09:00",
              "beijing": "2026-11-04T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T22:30:00+09:00",
              "beijing": "2026-11-05T21:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 411,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ishikawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ishikawa_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "isico_dgnet",
      "crawler": "backend/scripts/import_isico_dgnet_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "isico_dgnet",
          "scheduler": "schedule.yaml",
          "cron": "0 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:00",
          "command": "python3 -m backend.scripts.import_isico_dgnet_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_isico_dgnet_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:00:00+09:00",
              "beijing": "2026-11-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:00:00+09:00",
              "beijing": "2026-12-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:00:00+09:00",
              "beijing": "2027-01-09T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 830,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "isms_ac_certified_orgs",
      "crawler": "backend/crawlers/sources/isms_ac.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "isms_ac_certified_orgs",
          "scheduler": "schedule.yaml",
          "cron": "10 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:10",
          "command": "python3 -m backend.crawlers.sources.isms_ac --details",
          "modules": [
            "backend.crawlers.sources.isms_ac"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:10:00+09:00",
              "beijing": "2026-12-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:10:00+09:00",
              "beijing": "2027-01-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:10:00+09:00",
              "beijing": "2027-02-03T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1110,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "iwate_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_iwate_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/crawlers/sources/jetro_case_studies.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jetro_case_studies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:30",
          "command": "python3 -m backend.crawlers.sources.jetro_case_studies",
          "modules": [
            "backend.crawlers.sources.jetro_case_studies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:30:00+09:00",
              "beijing": "2026-12-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:30:00+09:00",
              "beijing": "2027-01-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:30:00+09:00",
              "beijing": "2027-02-03T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1164,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/crawlers/sources/jgoodtech_profiles.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jgrants",
      "crawler": "backend/crawlers/sources/jgrants.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jgrants",
          "scheduler": "schedule.yaml",
          "cron": "30 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:30",
          "command": "python3 -m backend.crawlers.sources.jgrants",
          "modules": [
            "backend.crawlers.sources.jgrants"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:30:00+09:00",
              "beijing": "2026-11-04T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:30:00+09:00",
              "beijing": "2026-11-05T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:30:00+09:00",
              "beijing": "2026-11-06T16:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1066,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jipdec_pmark",
      "crawler": "backend/crawlers/sources/jipdec_pmark.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jipdec_pmark",
          "scheduler": "schedule.yaml",
          "cron": "40 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:40",
          "command": "python3 -m backend.crawlers.sources.jipdec_pmark",
          "modules": [
            "backend.crawlers.sources.jipdec_pmark"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:40:00+09:00",
              "beijing": "2026-12-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:40:00+09:00",
              "beijing": "2027-01-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:40:00+09:00",
              "beijing": "2027-02-03T03:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1104,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jnet21_support_programs",
      "crawler": "backend/crawlers/sources/jnet21_support_programs.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jnet21_support_programs",
          "scheduler": "schedule.yaml",
          "cron": "45 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:45",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode rss --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:45:00+09:00",
              "beijing": "2026-11-04T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:45:00+09:00",
              "beijing": "2026-11-05T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:45:00+09:00",
              "beijing": "2026-11-06T01:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 677,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "scheduler": "schedule.yaml",
          "cron": "20 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 03:20",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode full --shard-prefectures --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T03:20:00+09:00",
              "beijing": "2026-11-09T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T03:20:00+09:00",
              "beijing": "2026-11-16T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T03:20:00+09:00",
              "beijing": "2026-11-23T02:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 683,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "job_placement_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "coverage": "configured_disabled",
      "plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jsda_members",
      "crawler": "backend/scripts/import_jsda_member_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "jsda_members",
          "scheduler": "schedule.yaml",
          "cron": "10 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:10",
          "command": "python3 -m backend.scripts.import_jsda_member_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_jsda_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:10:00+09:00",
              "beijing": "2026-11-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:10:00+09:00",
              "beijing": "2026-12-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:10:00+09:00",
              "beijing": "2027-01-08T09:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 812,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kagawa_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kagoshima_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kaken",
      "crawler": "backend/crawlers/sources/kaken_research_projects.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kaken",
          "scheduler": "schedule.yaml",
          "cron": "55 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:55",
          "command": "python3 -m backend.crawlers.sources.kaken_research_projects --rows 100 --max-pages 10 --request-delay 0.08",
          "modules": [
            "backend.crawlers.sources.kaken_research_projects"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:55:00+09:00",
              "beijing": "2026-11-10T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:55:00+09:00",
              "beijing": "2026-11-17T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:55:00+09:00",
              "beijing": "2026-11-24T07:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1170,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kanagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kanagawa_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "koeki_info_representatives",
      "crawler": "backend/scripts/import_koeki_info_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "koeki_info_representatives",
          "scheduler": "schedule.yaml",
          "cron": "30 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:30",
          "command": "python3 -m backend.scripts.import_koeki_info_representatives --start-page 1 --max-pages 6 --disp-number 100 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_koeki_info_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:30:00+09:00",
              "beijing": "2026-11-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:30:00+09:00",
              "beijing": "2026-12-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:30:00+09:00",
              "beijing": "2027-01-09T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 836,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kokodesearch_childcare_facility_csv",
      "crawler": "backend/scripts/import_kokodesearch_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "scheduler": "schedule.yaml",
          "cron": "0 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:00",
          "command": "python3 -m backend.scripts.import_kokodesearch_representatives --apply",
          "modules": [
            "backend.scripts.import_kokodesearch_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:00:00+09:00",
              "beijing": "2026-11-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:00:00+09:00",
              "beijing": "2026-12-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:00:00+09:00",
              "beijing": "2027-01-09T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 842,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "kumamoto_religious_corporations",
      "crawler": "backend/scripts/import_kumamoto_religious_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "kumamoto_religious_corporations",
          "scheduler": "schedule.yaml",
          "cron": "30 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:30",
          "command": "python3 -m backend.scripts.import_kumamoto_religious_reps --apply",
          "modules": [
            "backend.scripts.import_kumamoto_religious_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:30:00+09:00",
              "beijing": "2027-01-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:30:00+09:00",
              "beijing": "2027-04-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:30:00+09:00",
              "beijing": "2027-07-10T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 890,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "maebashi_sanpai_disposal_waste_licensees",
      "crawler": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "meti_alcohol",
      "crawler": "backend/scripts/import_meti_alcohol_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "meti_alcohol",
          "scheduler": "schedule.yaml",
          "cron": "40 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:40",
          "command": "python3 -m backend.scripts.import_meti_alcohol_reps --download --apply",
          "modules": [
            "backend.scripts.import_meti_alcohol_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:40:00+09:00",
              "beijing": "2026-11-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:40:00+09:00",
              "beijing": "2026-12-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:40:00+09:00",
              "beijing": "2027-01-08T04:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 758,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/scripts/import_public_representative_clues.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "miyagi_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "mlit_chintai_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mlit_jutaku_shukuhaku_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mlit_mansion_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "moj_registered_support_org",
      "crawler": "backend/scripts/import_moj_registered_support_org_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "moj_registered_support_org",
          "scheduler": "schedule.yaml",
          "cron": "10 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:10",
          "command": "python3 -m backend.scripts.import_moj_registered_support_org_reps --download --apply",
          "modules": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:10:00+09:00",
              "beijing": "2026-11-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:10:00+09:00",
              "beijing": "2026-12-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:10:00+09:00",
              "beijing": "2027-01-08T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 764,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "molink_company_profiles",
      "crawler": "backend/scripts/import_molink_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "molink_company_profiles",
          "scheduler": "schedule.yaml",
          "cron": "30 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:30",
          "command": "python3 -m backend.scripts.import_molink_representatives --start-id 1 --end-id 3000 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_molink_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:30:00+09:00",
              "beijing": "2026-11-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:30:00+09:00",
              "beijing": "2026-12-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:30:00+09:00",
              "beijing": "2027-01-09T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 848,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "nagano_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_nagano_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "nexco_east_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nexco_east_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:30",
          "command": "python3 -m backend.scripts.import_nexco_east_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:30:00+09:00",
              "beijing": "2026-11-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:30:00+09:00",
              "beijing": "2026-12-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:30:00+09:00",
              "beijing": "2027-01-09T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 866,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "nexco_west_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "niigata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_niigata_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/scripts/import_npo_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "nta_houjin",
      "crawler": "backend/scripts/import_houjin_bangou.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nta_houjin_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 19:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode daily",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T19:00:00+09:00",
              "beijing": "2026-11-03T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T19:00:00+09:00",
              "beijing": "2026-11-04T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T19:00:00+09:00",
              "beijing": "2026-11-05T18:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 380,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nta_houjin_monthly",
          "scheduler": "schedule.yaml",
          "cron": "0 18 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 18:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode monthly",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T18:00:00+09:00",
              "beijing": "2026-11-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T18:00:00+09:00",
              "beijing": "2026-12-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T18:00:00+09:00",
              "beijing": "2027-01-05T17:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 386,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/import_houjin_via_api.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "nta_houjin_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 19:30",
          "command": "python3 -m backend.scripts.import_houjin_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 419,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tyc-nta-daily.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 18:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.import_houjin_via_api --daily --rps 3",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:30:00+00:00",
              "beijing": "2026-11-04T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:30:00+00:00",
              "beijing": "2026-11-05T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:30:00+00:00",
              "beijing": "2026-11-06T02:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-nta-daily.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 18:30:00 UTC ; next_elapse=Tue 2026-11-03 18:30:00 UTC }\nNextElapseUSecRealtime=Tue 2026-11-03 18:30:00 UTC\nLastTriggerUSec=Mon 2026-11-02 18:30:01 UTC\nId=tyc-nta-daily.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/nta_history_backfill.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "osaka_city_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_city_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "osaka_medical_corporation_reports",
      "crawler": "backend/scripts/import_osaka_medical_corporation_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "osaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "pmark_jmra",
      "crawler": "backend/scripts/import_jmra_pmark_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "pmark_jmra",
          "scheduler": "schedule.yaml",
          "cron": "10 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:10",
          "command": "python3 -m backend.scripts.import_jmra_pmark_representatives --apply",
          "modules": [
            "backend.scripts.import_jmra_pmark_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:10:00+09:00",
              "beijing": "2026-11-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:10:00+09:00",
              "beijing": "2026-12-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:10:00+09:00",
              "beijing": "2027-01-08T08:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 800,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "real_estate_appraisers",
      "crawler": "backend/crawlers/sources/real_estate_appraisers.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "real_estate_appraisers",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.crawlers.sources.real_estate_appraisers",
          "modules": [
            "backend.crawlers.sources.real_estate_appraisers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1034,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "coverage": "static_reference_only",
      "plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ]
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "saitama_medical_corporation_reports",
      "crawler": "backend/scripts/import_saitama_medical_corporation_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "saitama_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "0 7 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 07:00",
          "command": "python3 -m backend.scripts.import_saitama_medical_corporation_reps --max-zips 30 --max-pdfs 600 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T07:00:00+09:00",
              "beijing": "2027-01-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T07:00:00+09:00",
              "beijing": "2027-04-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T07:00:00+09:00",
              "beijing": "2027-07-10T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 908,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sakai_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_sakai_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin_donors.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "sme_ma_support_institution",
      "crawler": "backend/scripts/import_sme_ma_support_institution_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "soumu_registered_telecom",
      "crawler": "backend/scripts/import_soumu_registered_telecom_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "soumu_registered_telecom",
          "scheduler": "schedule.yaml",
          "cron": "10 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:10",
          "command": "python3 -m backend.scripts.import_soumu_registered_telecom_reps --apply",
          "modules": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:10:00+09:00",
              "beijing": "2026-11-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:10:00+09:00",
              "beijing": "2026-12-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:10:00+09:00",
              "beijing": "2027-01-08T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 776,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "t2fifa_members",
      "crawler": "backend/scripts/import_t2fifa_member_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "t2fifa_members",
          "scheduler": "schedule.yaml",
          "cron": "40 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:40",
          "command": "python3 -m backend.scripts.import_t2fifa_member_representatives --max-pages 80 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_t2fifa_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:40:00+09:00",
              "beijing": "2026-11-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:40:00+09:00",
              "beijing": "2026-12-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:40:00+09:00",
              "beijing": "2027-01-08T08:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 806,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "takatsuki_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_takatsuki_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "takken_registry",
      "crawler": "backend/crawlers/sources/takken_registry.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "takken_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 11:00",
          "command": "python3 -m backend.crawlers.sources.takken_registry",
          "modules": [
            "backend.crawlers.sources.takken_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T11:00:00+09:00",
              "beijing": "2026-11-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T11:00:00+09:00",
              "beijing": "2026-12-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T11:00:00+09:00",
              "beijing": "2027-01-07T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 449,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "temp_staffing_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tochigi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tochigi_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "tokyo_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tokyo_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "tokyo_taishin_architect",
      "crawler": "backend/scripts/import_tokyo_taishin_architect_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tokyo_taishin_architect",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:00",
          "command": "python3 -m backend.scripts.import_tokyo_taishin_architect_reps --apply",
          "modules": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:00:00+09:00",
              "beijing": "2027-01-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:00:00+09:00",
              "beijing": "2027-04-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:00:00+09:00",
              "beijing": "2027-07-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 896,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tosankyo_members",
      "crawler": "backend/scripts/import_tosankyo_member_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "toyama_sanpai_association_members",
      "crawler": "backend/scripts/import_toyama_sanpai_association_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "toyama_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyama_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "toyonaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyonaka_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "university_portrait_private_school",
      "crawler": "backend/scripts/import_university_portrait_representatives.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "university_portrait_private_school",
          "scheduler": "schedule.yaml",
          "cron": "0 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:00",
          "command": "python3 -m backend.scripts.import_university_portrait_representatives --sleep 0.08 --apply",
          "modules": [
            "backend.scripts.import_university_portrait_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:00:00+09:00",
              "beijing": "2027-01-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:00:00+09:00",
              "beijing": "2027-04-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:00:00+09:00",
              "beijing": "2027-07-10T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 884,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "ur_qualified_suppliers",
      "crawler": "backend/scripts/import_ur_qualified_supplier_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "ur_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:00",
          "command": "python3 -m backend.scripts.import_ur_qualified_supplier_reps --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:00:00+09:00",
              "beijing": "2026-11-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:00:00+09:00",
              "beijing": "2026-12-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:00:00+09:00",
              "beijing": "2027-01-09T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 860,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "virtual_office_operators",
      "crawler": "backend/crawlers/sources/virtual_office_operators.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "virtual_office_operators",
          "scheduler": "schedule.yaml",
          "cron": "30 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:30",
          "command": "python3 -m backend.crawlers.sources.virtual_office_operators --operator all",
          "modules": [
            "backend.crawlers.sources.virtual_office_operators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:30:00+09:00",
              "beijing": "2026-11-04T08:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:30:00+09:00",
              "beijing": "2026-11-11T08:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:30:00+09:00",
              "beijing": "2026-11-18T08:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1042,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "wam_social_welfare_current_report",
      "crawler": "backend/scripts/import_wam_social_welfare_reps.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "wam_social_welfare_current_report",
          "scheduler": "schedule.yaml",
          "cron": "0 7 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 07:00",
          "command": "python3 -m backend.scripts.import_wam_social_welfare_reps --limit 10000 --sleep 0.2 --apply",
          "modules": [
            "backend.scripts.import_wam_social_welfare_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T07:00:00+09:00",
              "beijing": "2026-12-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T07:00:00+09:00",
              "beijing": "2027-01-09T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 854,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "yamagata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamagata_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "yamanashi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamanashi_sanpai_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "coverage": "direct_enabled",
      "plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ]
    },
    {
      "source": "company_public_legal_pages",
      "crawler": "backend/scripts/crawl_website_responsible_person_clues.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "company_website_data",
      "crawler": "backend/scripts/backfill_officers_from_website.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_en_name_from_edinet.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "geps",
      "crawler": "backend/scripts/backfill_geps_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/scripts/import_jetro_representatives.py",
      "coverage": "no_plan_found",
      "plans": []
    },
    {
      "source": "medical_info_net_pharmacy",
      "crawler": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
      "coverage": "no_plan_found",
      "plans": []
    }
  ],
  "schedule_metadata": {
    "checked_at": "2026-11-03T08:40:22.722502+00:00",
    "configuration_timezone": "Asia/Tokyo",
    "display_timezone": "Asia/Shanghai",
    "scheduler_service": "ExecStart={ path=/usr/bin/python3 ; argv[]=/usr/bin/python3 -m backend.scripts.run_scheduler ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }\nWorkingDirectory=/tyc-japan/tyc-japan\nActiveState=active\nSubState=running\n",
    "plan_count": 169,
    "enabled_plan_count": 162,
    "known_timer_count": 3,
    "weekday_note": "按 APScheduler 3 的 Monday=0 解释，已在 ubuntu 身份读取线上 run_scheduler.py:307、407 的 CronTrigger.from_crontab 调用，并与近期 fben / satsuben 周任务记录核对；未逐条验证全部任务实际执行。",
    "weekday_docs_url": "https://apscheduler.readthedocs.io/en/3.x/modules/triggers/cron.html",
    "prediction_note": "下次时间是按快照规则计算的计划，可能因停用、漏触发、超时、并发限制或实际调度器状态而改变。",
    "source_scope_note": "共享程序若配置 --source，则只关联指定来源；周期属于任务，不等于每条企业记录或整站数据的更新周期。",
    "coverage_counts": {
      "direct_enabled": 173,
      "no_plan_found": 65,
      "static_reference_only": 6,
      "configured_disabled": 2
    }
  },
  "table_volumes": {
    "address_base_aza": {
      "table_name": "address_base_aza",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 727431,
      "unknown_row_estimates": 0,
      "heap_bytes": 225574912,
      "data_bytes": 225665024,
      "index_bytes": 85417984,
      "total_bytes": 311083008,
      "oldest_analyze_seen": "2026-10-02T19:21:33.889477+00:00",
      "latest_analyze_seen": "2026-10-02T19:40:10.867458+00:00",
      "checked_at": "2026-11-02T09:45:31.364486+00:00",
      "rows_method": "statistics_estimate",
      "rows": 727431,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "address_base_registry_files": {
      "table_name": "address_base_registry_files",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 32768,
      "total_bytes": 81920,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364514+00:00",
      "rows_method": "exact_count",
      "rows": 1,
      "count_checked_at": "2026-11-02T09:45:31.483467+00:00",
      "exact_count_status": "success"
    },
    "address_clusters": {
      "table_name": "address_clusters",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5639584,
      "unknown_row_estimates": 0,
      "heap_bytes": 942800896,
      "data_bytes": 943095808,
      "index_bytes": 616546304,
      "total_bytes": 1559642112,
      "oldest_analyze_seen": "2026-05-30T04:14:18.603923+00:00",
      "latest_analyze_seen": "2026-05-30T04:14:18.603923+00:00",
      "checked_at": "2026-11-02T09:45:31.364519+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5639584,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "appraisal_reports": {
      "table_name": "appraisal_reports",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 57182,
      "unknown_row_estimates": 0,
      "heap_bytes": 37232640,
      "data_bytes": 344301568,
      "index_bytes": 7979008,
      "total_bytes": 352280576,
      "oldest_analyze_seen": "2026-05-21T07:58:20.564008+00:00",
      "latest_analyze_seen": "2026-05-21T07:58:20.564008+00:00",
      "checked_at": "2026-11-02T09:45:31.364526+00:00",
      "rows_method": "statistics_estimate",
      "rows": 57182,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "awards": {
      "table_name": "awards",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 16084,
      "unknown_row_estimates": 0,
      "heap_bytes": 8740864,
      "data_bytes": 8806400,
      "index_bytes": 3096576,
      "total_bytes": 11902976,
      "oldest_analyze_seen": "2026-09-02T21:36:31.426594+00:00",
      "latest_analyze_seen": "2026-09-02T21:36:31.426594+00:00",
      "checked_at": "2026-11-02T09:45:31.36453+00:00",
      "rows_method": "statistics_estimate",
      "rows": 16084,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "bid_notice_crawl_segments": {
      "table_name": "bid_notice_crawl_segments",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 13226,
      "unknown_row_estimates": 0,
      "heap_bytes": 3473408,
      "data_bytes": 3514368,
      "index_bytes": 3153920,
      "total_bytes": 6668288,
      "oldest_analyze_seen": "2026-11-01T17:20:52.804392+00:00",
      "latest_analyze_seen": "2026-11-01T17:20:52.804392+00:00",
      "checked_at": "2026-11-02T09:45:31.364533+00:00",
      "rows_method": "exact_count",
      "rows": 13242,
      "count_checked_at": "2026-11-02T09:45:31.744013+00:00",
      "exact_count_status": "success"
    },
    "bid_notices": {
      "table_name": "bid_notices",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 634769,
      "unknown_row_estimates": 0,
      "heap_bytes": 625131520,
      "data_bytes": 7091888128,
      "index_bytes": 5518573568,
      "total_bytes": 12610461696,
      "oldest_analyze_seen": "2026-06-04T18:37:53.694444+00:00",
      "latest_analyze_seen": "2026-10-09T20:49:48.473452+00:00",
      "checked_at": "2026-11-02T09:45:31.364536+00:00",
      "rows_method": "statistics_estimate",
      "rows": 634769,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "business_licenses": {
      "table_name": "business_licenses",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 963673,
      "unknown_row_estimates": 0,
      "heap_bytes": 485138432,
      "data_bytes": 485965824,
      "index_bytes": 120365056,
      "total_bytes": 606330880,
      "oldest_analyze_seen": "2026-09-14T10:54:32.105983+00:00",
      "latest_analyze_seen": "2026-09-14T10:54:32.105983+00:00",
      "checked_at": "2026-11-02T09:45:31.364539+00:00",
      "rows_method": "statistics_estimate",
      "rows": 963673,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "care_facilities": {
      "table_name": "care_facilities",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 224449,
      "unknown_row_estimates": 0,
      "heap_bytes": 181657600,
      "data_bytes": 181739520,
      "index_bytes": 58957824,
      "total_bytes": 240697344,
      "oldest_analyze_seen": "2026-10-08T03:13:57.946523+00:00",
      "latest_analyze_seen": "2026-10-08T03:13:57.946523+00:00",
      "checked_at": "2026-11-02T09:45:31.364543+00:00",
      "rows_method": "statistics_estimate",
      "rows": 224449,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "certifications": {
      "table_name": "certifications",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 674189,
      "unknown_row_estimates": 0,
      "heap_bytes": 1351704576,
      "data_bytes": 1479811072,
      "index_bytes": 321871872,
      "total_bytes": 1801682944,
      "oldest_analyze_seen": "2026-10-11T04:13:33.067202+00:00",
      "latest_analyze_seen": "2026-10-11T04:13:33.067202+00:00",
      "checked_at": "2026-11-02T09:45:31.364546+00:00",
      "rows_method": "statistics_estimate",
      "rows": 674189,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "companies": {
      "table_name": "companies",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5835247,
      "unknown_row_estimates": 0,
      "heap_bytes": 6267789312,
      "data_bytes": 6269558784,
      "index_bytes": 20112547840,
      "total_bytes": 26382106624,
      "oldest_analyze_seen": "2026-06-08T19:38:06.279754+00:00",
      "latest_analyze_seen": "2026-10-27T19:17:42.941433+00:00",
      "checked_at": "2026-11-02T09:45:31.364549+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5835247,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "companies_virtual_office_match": {
      "table_name": "companies_virtual_office_match",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 411,
      "unknown_row_estimates": 0,
      "heap_bytes": 90112,
      "data_bytes": 131072,
      "index_bytes": 147456,
      "total_bytes": 278528,
      "oldest_analyze_seen": "2026-05-16T10:38:43.62572+00:00",
      "latest_analyze_seen": "2026-05-16T10:38:43.62572+00:00",
      "checked_at": "2026-11-02T09:45:31.364552+00:00",
      "rows_method": "exact_count",
      "rows": 411,
      "count_checked_at": "2026-11-02T09:45:31.883035+00:00",
      "exact_count_status": "success"
    },
    "company_address_aza_matches": {
      "table_name": "company_address_aza_matches",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 16384,
      "total_bytes": 24576,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364557+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:31.968473+00:00",
      "exact_count_status": "success"
    },
    "company_aliases": {
      "table_name": "company_aliases",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 20932,
      "unknown_row_estimates": 0,
      "heap_bytes": 2310144,
      "data_bytes": 2351104,
      "index_bytes": 7897088,
      "total_bytes": 10248192,
      "oldest_analyze_seen": "2026-10-28T10:04:38.255011+00:00",
      "latest_analyze_seen": "2026-10-28T10:04:38.255011+00:00",
      "checked_at": "2026-11-02T09:45:31.36456+00:00",
      "rows_method": "statistics_estimate",
      "rows": 20932,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_associations": {
      "table_name": "company_associations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1784,
      "unknown_row_estimates": 0,
      "heap_bytes": 1081344,
      "data_bytes": 1122304,
      "index_bytes": 614400,
      "total_bytes": 1736704,
      "oldest_analyze_seen": "2026-10-04T02:08:41.899876+00:00",
      "latest_analyze_seen": "2026-10-04T02:08:41.899876+00:00",
      "checked_at": "2026-11-02T09:45:31.364563+00:00",
      "rows_method": "exact_count",
      "rows": 1784,
      "count_checked_at": "2026-11-02T09:45:32.053272+00:00",
      "exact_count_status": "success"
    },
    "company_business_model": {
      "table_name": "company_business_model",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 8633353,
      "unknown_row_estimates": 0,
      "heap_bytes": 2494857216,
      "data_bytes": 2495578112,
      "index_bytes": 510607360,
      "total_bytes": 3006185472,
      "oldest_analyze_seen": "2026-05-17T03:46:01.301724+00:00",
      "latest_analyze_seen": "2026-05-17T03:46:01.301724+00:00",
      "checked_at": "2026-11-02T09:45:31.364567+00:00",
      "rows_method": "statistics_estimate",
      "rows": 8633353,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_business_purpose": {
      "table_name": "company_business_purpose",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 49620,
      "unknown_row_estimates": 0,
      "heap_bytes": 47718400,
      "data_bytes": 111689728,
      "index_bytes": 7831552,
      "total_bytes": 119521280,
      "oldest_analyze_seen": "2026-05-30T02:15:25.490043+00:00",
      "latest_analyze_seen": "2026-05-30T02:15:25.490043+00:00",
      "checked_at": "2026-11-02T09:45:31.36457+00:00",
      "rows_method": "statistics_estimate",
      "rows": 49620,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_business_scope": {
      "table_name": "company_business_scope",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3672422,
      "unknown_row_estimates": 0,
      "heap_bytes": 858980352,
      "data_bytes": 859250688,
      "index_bytes": 601358336,
      "total_bytes": 1460609024,
      "oldest_analyze_seen": "2026-05-17T02:26:35.218891+00:00",
      "latest_analyze_seen": "2026-05-17T02:26:35.218891+00:00",
      "checked_at": "2026-11-02T09:45:31.364574+00:00",
      "rows_method": "statistics_estimate",
      "rows": 3672422,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_changes": {
      "table_name": "company_changes",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 8391664,
      "unknown_row_estimates": 0,
      "heap_bytes": 2151604224,
      "data_bytes": 2152226816,
      "index_bytes": 1414176768,
      "total_bytes": 3566403584,
      "oldest_analyze_seen": "2026-10-31T18:34:18.993994+00:00",
      "latest_analyze_seen": "2026-10-31T18:34:18.993994+00:00",
      "checked_at": "2026-11-02T09:45:31.364577+00:00",
      "rows_method": "statistics_estimate",
      "rows": 8391664,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_co_major_shareholder": {
      "table_name": "company_co_major_shareholder",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 207452,
      "unknown_row_estimates": 0,
      "heap_bytes": 34635776,
      "data_bytes": 34684928,
      "index_bytes": 4562944,
      "total_bytes": 39247872,
      "oldest_analyze_seen": "2026-05-15T17:39:03.475576+00:00",
      "latest_analyze_seen": "2026-05-15T17:39:03.475576+00:00",
      "checked_at": "2026-11-02T09:45:31.36458+00:00",
      "rows_method": "statistics_estimate",
      "rows": 207452,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_contract_profile": {
      "table_name": "company_contract_profile",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 22961,
      "unknown_row_estimates": 0,
      "heap_bytes": 7323648,
      "data_bytes": 7364608,
      "index_bytes": 1859584,
      "total_bytes": 9224192,
      "oldest_analyze_seen": "2026-05-13T16:10:18.033675+00:00",
      "latest_analyze_seen": "2026-05-13T16:10:18.033675+00:00",
      "checked_at": "2026-11-02T09:45:31.364583+00:00",
      "rows_method": "statistics_estimate",
      "rows": 22961,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_family_control": {
      "table_name": "company_family_control",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 20687,
      "unknown_row_estimates": 0,
      "heap_bytes": 2277376,
      "data_bytes": 2318336,
      "index_bytes": 835584,
      "total_bytes": 3153920,
      "oldest_analyze_seen": "2026-05-15T17:39:01.098565+00:00",
      "latest_analyze_seen": "2026-05-15T17:39:01.098565+00:00",
      "checked_at": "2026-11-02T09:45:31.364586+00:00",
      "rows_method": "exact_count",
      "rows": 20687,
      "count_checked_at": "2026-11-02T09:45:32.194462+00:00",
      "exact_count_status": "success"
    },
    "company_financial_quality": {
      "table_name": "company_financial_quality",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 29258,
      "unknown_row_estimates": 0,
      "heap_bytes": 7561216,
      "data_bytes": 7602176,
      "index_bytes": 2572288,
      "total_bytes": 10174464,
      "oldest_analyze_seen": "2026-05-16T07:52:34.338656+00:00",
      "latest_analyze_seen": "2026-05-16T07:52:34.338656+00:00",
      "checked_at": "2026-11-02T09:45:31.364592+00:00",
      "rows_method": "statistics_estimate",
      "rows": 29258,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_foreign_capital": {
      "table_name": "company_foreign_capital",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1641,
      "unknown_row_estimates": 0,
      "heap_bytes": 1073152,
      "data_bytes": 1114112,
      "index_bytes": 270336,
      "total_bytes": 1384448,
      "oldest_analyze_seen": "2026-11-01T02:30:09.790839+00:00",
      "latest_analyze_seen": "2026-11-01T02:30:09.790839+00:00",
      "checked_at": "2026-11-02T09:45:31.364595+00:00",
      "rows_method": "exact_count",
      "rows": 1641,
      "count_checked_at": "2026-11-02T09:45:32.283653+00:00",
      "exact_count_status": "success"
    },
    "company_geo_density_grid": {
      "table_name": "company_geo_density_grid",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 827154,
      "unknown_row_estimates": 0,
      "heap_bytes": 49831936,
      "data_bytes": 49872896,
      "index_bytes": 39198720,
      "total_bytes": 89071616,
      "oldest_analyze_seen": "2026-11-02T04:55:42.21844+00:00",
      "latest_analyze_seen": "2026-11-02T04:55:42.21844+00:00",
      "checked_at": "2026-11-02T09:45:31.364598+00:00",
      "rows_method": "statistics_estimate",
      "rows": 827154,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_geocode_attempts": {
      "table_name": "company_geocode_attempts",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 115189,
      "unknown_row_estimates": 0,
      "heap_bytes": 25870336,
      "data_bytes": 25911296,
      "index_bytes": 5881856,
      "total_bytes": 31793152,
      "oldest_analyze_seen": "2026-10-30T10:45:49.414973+00:00",
      "latest_analyze_seen": "2026-10-30T10:45:49.414973+00:00",
      "checked_at": "2026-11-02T09:45:31.364601+00:00",
      "rows_method": "statistics_estimate",
      "rows": 115189,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_geocodes": {
      "table_name": "company_geocodes",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5784243,
      "unknown_row_estimates": 0,
      "heap_bytes": 3005505536,
      "data_bytes": 3006373888,
      "index_bytes": 1343324160,
      "total_bytes": 4349698048,
      "oldest_analyze_seen": "2026-05-25T10:13:59.715408+00:00",
      "latest_analyze_seen": "2026-05-25T10:13:59.715408+00:00",
      "checked_at": "2026-11-02T09:45:31.364604+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5784243,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_industry_inferred": {
      "table_name": "company_industry_inferred",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 6128039,
      "unknown_row_estimates": 0,
      "heap_bytes": 1237417984,
      "data_bytes": 1237794816,
      "index_bytes": 277372928,
      "total_bytes": 1515167744,
      "oldest_analyze_seen": "2026-05-29T15:57:45.766753+00:00",
      "latest_analyze_seen": "2026-05-29T15:57:45.766753+00:00",
      "checked_at": "2026-11-02T09:45:31.364608+00:00",
      "rows_method": "statistics_estimate",
      "rows": 6128039,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_industry_rank": {
      "table_name": "company_industry_rank",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 876593,
      "unknown_row_estimates": 0,
      "heap_bytes": 222035968,
      "data_bytes": 222126080,
      "index_bytes": 56369152,
      "total_bytes": 278495232,
      "oldest_analyze_seen": "2026-05-14T16:38:31.193154+00:00",
      "latest_analyze_seen": "2026-05-14T16:38:31.193154+00:00",
      "checked_at": "2026-11-02T09:45:31.364611+00:00",
      "rows_method": "statistics_estimate",
      "rows": 876593,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_interlocks": {
      "table_name": "company_interlocks",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5744,
      "unknown_row_estimates": 0,
      "heap_bytes": 876544,
      "data_bytes": 917504,
      "index_bytes": 327680,
      "total_bytes": 1245184,
      "oldest_analyze_seen": "2026-05-15T17:11:30.732127+00:00",
      "latest_analyze_seen": "2026-05-15T17:11:30.732127+00:00",
      "checked_at": "2026-11-02T09:45:31.364614+00:00",
      "rows_method": "exact_count",
      "rows": 5744,
      "count_checked_at": "2026-11-02T09:45:32.423428+00:00",
      "exact_count_status": "success"
    },
    "company_intl_profile": {
      "table_name": "company_intl_profile",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3724,
      "unknown_row_estimates": 0,
      "heap_bytes": 827392,
      "data_bytes": 868352,
      "index_bytes": 229376,
      "total_bytes": 1097728,
      "oldest_analyze_seen": "2026-05-13T16:34:45.396153+00:00",
      "latest_analyze_seen": "2026-05-13T16:34:45.396153+00:00",
      "checked_at": "2026-11-02T09:45:31.364617+00:00",
      "rows_method": "exact_count",
      "rows": 2485,
      "count_checked_at": "2026-11-02T09:45:32.563551+00:00",
      "exact_count_status": "success"
    },
    "company_ip_profile": {
      "table_name": "company_ip_profile",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 4663,
      "unknown_row_estimates": 0,
      "heap_bytes": 2048000,
      "data_bytes": 2088960,
      "index_bytes": 688128,
      "total_bytes": 2777088,
      "oldest_analyze_seen": "2026-06-10T18:54:14.371024+00:00",
      "latest_analyze_seen": "2026-06-10T18:54:14.371024+00:00",
      "checked_at": "2026-11-02T09:45:31.36462+00:00",
      "rows_method": "exact_count",
      "rows": 4339,
      "count_checked_at": "2026-11-02T09:45:32.653841+00:00",
      "exact_count_status": "success"
    },
    "company_key_persons": {
      "table_name": "company_key_persons",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 4222,
      "unknown_row_estimates": 0,
      "heap_bytes": 7135232,
      "data_bytes": 7176192,
      "index_bytes": 270336,
      "total_bytes": 7446528,
      "oldest_analyze_seen": "2026-05-13T16:23:03.28993+00:00",
      "latest_analyze_seen": "2026-05-13T16:23:03.28993+00:00",
      "checked_at": "2026-11-02T09:45:31.364623+00:00",
      "rows_method": "exact_count",
      "rows": 4064,
      "count_checked_at": "2026-11-02T09:45:32.803502+00:00",
      "exact_count_status": "success"
    },
    "company_location_profiles": {
      "table_name": "company_location_profiles",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5773007,
      "unknown_row_estimates": 0,
      "heap_bytes": 5640396800,
      "data_bytes": 5641994240,
      "index_bytes": 2722881536,
      "total_bytes": 8364875776,
      "oldest_analyze_seen": "2026-10-25T21:10:23.166543+00:00",
      "latest_analyze_seen": "2026-10-25T21:10:23.166543+00:00",
      "checked_at": "2026-11-02T09:45:31.364626+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5773007,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_management_stability": {
      "table_name": "company_management_stability",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 16384,
      "total_bytes": 24576,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.36463+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:32.913414+00:00",
      "exact_count_status": "success"
    },
    "company_paper_co_flag": {
      "table_name": "company_paper_co_flag",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5822269,
      "unknown_row_estimates": 0,
      "heap_bytes": 1204756480,
      "data_bytes": 1205125120,
      "index_bytes": 379977728,
      "total_bytes": 1585102848,
      "oldest_analyze_seen": "2026-07-28T11:41:45.98674+00:00",
      "latest_analyze_seen": "2026-07-28T11:41:45.98674+00:00",
      "checked_at": "2026-11-02T09:45:31.364633+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5822269,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_pep_profile": {
      "table_name": "company_pep_profile",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 38,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 32768,
      "total_bytes": 81920,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364636+00:00",
      "rows_method": "exact_count",
      "rows": 38,
      "count_checked_at": "2026-11-02T09:45:33.004273+00:00",
      "exact_count_status": "success"
    },
    "company_professional_staff": {
      "table_name": "company_professional_staff",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 2481,
      "unknown_row_estimates": 0,
      "heap_bytes": 622592,
      "data_bytes": 843776,
      "index_bytes": 139264,
      "total_bytes": 983040,
      "oldest_analyze_seen": "2026-05-14T16:44:15.35313+00:00",
      "latest_analyze_seen": "2026-05-14T16:44:15.35313+00:00",
      "checked_at": "2026-11-02T09:45:31.364639+00:00",
      "rows_method": "exact_count",
      "rows": 2481,
      "count_checked_at": "2026-11-02T09:45:33.113420+00:00",
      "exact_count_status": "success"
    },
    "company_profile_card": {
      "table_name": "company_profile_card",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3151064,
      "unknown_row_estimates": 0,
      "heap_bytes": 3101917184,
      "data_bytes": 3103604736,
      "index_bytes": 170278912,
      "total_bytes": 3273883648,
      "oldest_analyze_seen": "2026-05-14T16:44:28.233185+00:00",
      "latest_analyze_seen": "2026-05-14T16:44:28.233185+00:00",
      "checked_at": "2026-11-02T09:45:31.364642+00:00",
      "rows_method": "statistics_estimate",
      "rows": 3151064,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_registered_profiles": {
      "table_name": "company_registered_profiles",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 32768,
      "total_bytes": 40960,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364645+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:33.253108+00:00",
      "exact_count_status": "success"
    },
    "company_relationships": {
      "table_name": "company_relationships",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 365123,
      "unknown_row_estimates": 0,
      "heap_bytes": 129040384,
      "data_bytes": 129105920,
      "index_bytes": 97288192,
      "total_bytes": 226394112,
      "oldest_analyze_seen": "2026-09-06T11:00:28.654873+00:00",
      "latest_analyze_seen": "2026-09-06T11:00:28.654873+00:00",
      "checked_at": "2026-11-02T09:45:31.364648+00:00",
      "rows_method": "statistics_estimate",
      "rows": 365123,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_risk_dashboard": {
      "table_name": "company_risk_dashboard",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5006045,
      "unknown_row_estimates": 0,
      "heap_bytes": 487153664,
      "data_bytes": 487317504,
      "index_bytes": 254050304,
      "total_bytes": 741367808,
      "oldest_analyze_seen": "2026-05-14T16:37:17.005415+00:00",
      "latest_analyze_seen": "2026-05-14T16:37:17.005415+00:00",
      "checked_at": "2026-11-02T09:45:31.364651+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5006045,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_same_address": {
      "table_name": "company_same_address",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 607470,
      "unknown_row_estimates": 0,
      "heap_bytes": 192479232,
      "data_bytes": 192561152,
      "index_bytes": 53813248,
      "total_bytes": 246374400,
      "oldest_analyze_seen": "2026-05-15T17:43:07.835506+00:00",
      "latest_analyze_seen": "2026-05-15T17:43:07.835506+00:00",
      "checked_at": "2026-11-02T09:45:31.364654+00:00",
      "rows_method": "statistics_estimate",
      "rows": 607470,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_subpage_data": {
      "table_name": "company_subpage_data",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1012855,
      "unknown_row_estimates": 0,
      "heap_bytes": 1164181504,
      "data_bytes": 2747637760,
      "index_bytes": 109043712,
      "total_bytes": 2856681472,
      "oldest_analyze_seen": "2026-10-05T17:54:29.463275+00:00",
      "latest_analyze_seen": "2026-10-05T17:54:29.463275+00:00",
      "checked_at": "2026-11-02T09:45:31.364657+00:00",
      "rows_method": "statistics_estimate",
      "rows": 1012855,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_subsidiary_closure": {
      "table_name": "company_subsidiary_closure",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 16744,
      "unknown_row_estimates": 0,
      "heap_bytes": 2392064,
      "data_bytes": 2433024,
      "index_bytes": 1966080,
      "total_bytes": 4399104,
      "oldest_analyze_seen": "2026-05-14T16:39:59.168281+00:00",
      "latest_analyze_seen": "2026-05-14T16:39:59.168281+00:00",
      "checked_at": "2026-11-02T09:45:31.36466+00:00",
      "rows_method": "exact_count",
      "rows": 16744,
      "count_checked_at": "2026-11-02T09:45:33.413348+00:00",
      "exact_count_status": "success"
    },
    "company_ubo": {
      "table_name": "company_ubo",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 4304,
      "unknown_row_estimates": 0,
      "heap_bytes": 835584,
      "data_bytes": 876544,
      "index_bytes": 237568,
      "total_bytes": 1114112,
      "oldest_analyze_seen": "2026-05-13T16:10:32.79095+00:00",
      "latest_analyze_seen": "2026-05-13T16:10:32.79095+00:00",
      "checked_at": "2026-11-02T09:45:31.364664+00:00",
      "rows_method": "exact_count",
      "rows": 4304,
      "count_checked_at": "2026-11-02T09:45:33.551026+00:00",
      "exact_count_status": "success"
    },
    "company_vitality_score": {
      "table_name": "company_vitality_score",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 8523622,
      "unknown_row_estimates": 0,
      "heap_bytes": 3292192768,
      "data_bytes": 3293134848,
      "index_bytes": 407527424,
      "total_bytes": 3700662272,
      "oldest_analyze_seen": "2026-05-14T16:54:38.880623+00:00",
      "latest_analyze_seen": "2026-05-14T16:54:38.880623+00:00",
      "checked_at": "2026-11-02T09:45:31.364667+00:00",
      "rows_method": "statistics_estimate",
      "rows": 8523622,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_website_data": {
      "table_name": "company_website_data",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1046969,
      "unknown_row_estimates": 0,
      "heap_bytes": 700391424,
      "data_bytes": 702849024,
      "index_bytes": 93569024,
      "total_bytes": 796418048,
      "oldest_analyze_seen": "2026-09-03T17:06:01.131626+00:00",
      "latest_analyze_seen": "2026-09-03T17:06:01.131626+00:00",
      "checked_at": "2026-11-02T09:45:31.36467+00:00",
      "rows_method": "statistics_estimate",
      "rows": 1046969,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "company_wikidata": {
      "table_name": "company_wikidata",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 87642,
      "unknown_row_estimates": 0,
      "heap_bytes": 173998080,
      "data_bytes": 174096384,
      "index_bytes": 15695872,
      "total_bytes": 189792256,
      "oldest_analyze_seen": "2026-11-02T01:51:28.395003+00:00",
      "latest_analyze_seen": "2026-11-02T01:51:28.395003+00:00",
      "checked_at": "2026-11-02T09:45:31.364673+00:00",
      "rows_method": "statistics_estimate",
      "rows": 87642,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "compliance_check_batches": {
      "table_name": "compliance_check_batches",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 2,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 32768,
      "total_bytes": 81920,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364676+00:00",
      "rows_method": "exact_count",
      "rows": 2,
      "count_checked_at": "2026-11-02T09:45:33.653418+00:00",
      "exact_count_status": "success"
    },
    "compliance_check_decisions": {
      "table_name": "compliance_check_decisions",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 16384,
      "total_bytes": 24576,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.36468+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:33.733322+00:00",
      "exact_count_status": "success"
    },
    "compliance_check_evidence": {
      "table_name": "compliance_check_evidence",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 81920,
      "total_bytes": 131072,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364683+00:00",
      "rows_method": "exact_count",
      "rows": 5,
      "count_checked_at": "2026-11-02T09:45:33.863385+00:00",
      "exact_count_status": "success"
    },
    "compliance_check_targets": {
      "table_name": "compliance_check_targets",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 90112,
      "total_bytes": 139264,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364685+00:00",
      "rows_method": "exact_count",
      "rows": 5,
      "count_checked_at": "2026-11-02T09:45:34.002697+00:00",
      "exact_count_status": "success"
    },
    "construction_licenses": {
      "table_name": "construction_licenses",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 448665,
      "unknown_row_estimates": 0,
      "heap_bytes": 298221568,
      "data_bytes": 298336256,
      "index_bytes": 112377856,
      "total_bytes": 410714112,
      "oldest_analyze_seen": "2026-10-05T04:52:42.661588+00:00",
      "latest_analyze_seen": "2026-10-05T04:52:42.661588+00:00",
      "checked_at": "2026-11-02T09:45:31.364688+00:00",
      "rows_method": "statistics_estimate",
      "rows": 448665,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "corp_keiretsu_cluster": {
      "table_name": "corp_keiretsu_cluster",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 17268,
      "unknown_row_estimates": 0,
      "heap_bytes": 1179648,
      "data_bytes": 1212416,
      "index_bytes": 1163264,
      "total_bytes": 2375680,
      "oldest_analyze_seen": "2026-05-15T17:35:45.649727+00:00",
      "latest_analyze_seen": "2026-05-15T17:35:45.649727+00:00",
      "checked_at": "2026-11-02T09:45:31.364691+00:00",
      "rows_method": "exact_count",
      "rows": 17268,
      "count_checked_at": "2026-11-02T09:45:34.173384+00:00",
      "exact_count_status": "success"
    },
    "court_case_company_links": {
      "table_name": "court_case_company_links",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 14279,
      "unknown_row_estimates": 0,
      "heap_bytes": 4358144,
      "data_bytes": 4399104,
      "index_bytes": 2433024,
      "total_bytes": 6832128,
      "oldest_analyze_seen": "2026-06-08T13:37:06.732541+00:00",
      "latest_analyze_seen": "2026-06-08T13:37:06.732541+00:00",
      "checked_at": "2026-11-02T09:45:31.364694+00:00",
      "rows_method": "exact_count",
      "rows": 13354,
      "count_checked_at": "2026-11-02T09:45:34.264739+00:00",
      "exact_count_status": "success"
    },
    "court_case_facts": {
      "table_name": "court_case_facts",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 60710,
      "unknown_row_estimates": 0,
      "heap_bytes": 63193088,
      "data_bytes": 367075328,
      "index_bytes": 9895936,
      "total_bytes": 376971264,
      "oldest_analyze_seen": "2026-06-08T13:44:37.454783+00:00",
      "latest_analyze_seen": "2026-06-08T13:44:37.454783+00:00",
      "checked_at": "2026-11-02T09:45:31.364697+00:00",
      "rows_method": "statistics_estimate",
      "rows": 60710,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "court_case_judges": {
      "table_name": "court_case_judges",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 219435,
      "unknown_row_estimates": 0,
      "heap_bytes": 66715648,
      "data_bytes": 66772992,
      "index_bytes": 34611200,
      "total_bytes": 101384192,
      "oldest_analyze_seen": "2026-06-08T13:44:40.333405+00:00",
      "latest_analyze_seen": "2026-06-08T13:44:40.333405+00:00",
      "checked_at": "2026-11-02T09:45:31.3647+00:00",
      "rows_method": "statistics_estimate",
      "rows": 219435,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "court_hanrei_pdf_parses": {
      "table_name": "court_hanrei_pdf_parses",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 54633,
      "unknown_row_estimates": 0,
      "heap_bytes": 66699264,
      "data_bytes": 1207468032,
      "index_bytes": 1477468160,
      "total_bytes": 2684936192,
      "oldest_analyze_seen": "2026-06-08T12:36:13.315629+00:00",
      "latest_analyze_seen": "2026-06-08T12:36:13.315629+00:00",
      "checked_at": "2026-11-02T09:45:31.364703+00:00",
      "rows_method": "statistics_estimate",
      "rows": 54633,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "crawl_jobs": {
      "table_name": "crawl_jobs",
      "relkind": "p",
      "physical_relations": 3,
      "estimated_rows": 178492,
      "unknown_row_estimates": 0,
      "heap_bytes": 65175552,
      "data_bytes": 68255744,
      "index_bytes": 20856832,
      "total_bytes": 89112576,
      "oldest_analyze_seen": "2026-05-29T13:57:02.642812+00:00",
      "latest_analyze_seen": "2026-10-31T05:55:08.221836+00:00",
      "checked_at": "2026-11-02T09:45:31.364706+00:00",
      "rows_method": "statistics_estimate",
      "rows": 178492,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "crawl_jobs_2026_05": {
      "table_name": "crawl_jobs_2026_05",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 111855,
      "unknown_row_estimates": 0,
      "heap_bytes": 34627584,
      "data_bytes": 34734080,
      "index_bytes": 14163968,
      "total_bytes": 48898048,
      "oldest_analyze_seen": "2026-05-29T13:57:02.642812+00:00",
      "latest_analyze_seen": "2026-05-29T13:57:02.642812+00:00",
      "checked_at": "2026-11-02T09:45:31.364709+00:00",
      "rows_method": "statistics_estimate",
      "rows": 111855,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "crawl_jobs_2026_06": {
      "table_name": "crawl_jobs_2026_06",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 22368,
      "unknown_row_estimates": 0,
      "heap_bytes": 15335424,
      "data_bytes": 18194432,
      "index_bytes": 2392064,
      "total_bytes": 20586496,
      "oldest_analyze_seen": "2026-06-30T08:30:12.799127+00:00",
      "latest_analyze_seen": "2026-06-30T08:30:12.799127+00:00",
      "checked_at": "2026-11-02T09:45:31.364712+00:00",
      "rows_method": "statistics_estimate",
      "rows": 22368,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "crawl_jobs_default": {
      "table_name": "crawl_jobs_default",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 44269,
      "unknown_row_estimates": 0,
      "heap_bytes": 15212544,
      "data_bytes": 15327232,
      "index_bytes": 4300800,
      "total_bytes": 19628032,
      "oldest_analyze_seen": "2026-10-31T05:55:08.221836+00:00",
      "latest_analyze_seen": "2026-10-31T05:55:08.221836+00:00",
      "checked_at": "2026-11-02T09:45:31.364716+00:00",
      "rows_method": "statistics_estimate",
      "rows": 44269,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "cross_listings": {
      "table_name": "cross_listings",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 65,
      "unknown_row_estimates": 0,
      "heap_bytes": 90112,
      "data_bytes": 131072,
      "index_bytes": 65536,
      "total_bytes": 196608,
      "oldest_analyze_seen": "2026-10-05T21:04:19.127711+00:00",
      "latest_analyze_seen": "2026-10-05T21:04:19.127711+00:00",
      "checked_at": "2026-11-02T09:45:31.364719+00:00",
      "rows_method": "exact_count",
      "rows": 65,
      "count_checked_at": "2026-11-02T09:45:34.363591+00:00",
      "exact_count_status": "success"
    },
    "data_quality_metrics": {
      "table_name": "data_quality_metrics",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 10631,
      "unknown_row_estimates": 0,
      "heap_bytes": 3686400,
      "data_bytes": 3727360,
      "index_bytes": 2007040,
      "total_bytes": 5734400,
      "oldest_analyze_seen": "2026-10-28T19:40:17.652258+00:00",
      "latest_analyze_seen": "2026-10-28T19:40:17.652258+00:00",
      "checked_at": "2026-11-02T09:45:31.364722+00:00",
      "rows_method": "exact_count",
      "rows": 10870,
      "count_checked_at": "2026-11-02T09:45:34.574636+00:00",
      "exact_count_status": "success"
    },
    "data_sources": {
      "table_name": "data_sources",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 223,
      "unknown_row_estimates": 0,
      "heap_bytes": 655360,
      "data_bytes": 696320,
      "index_bytes": 90112,
      "total_bytes": 786432,
      "oldest_analyze_seen": "2026-11-02T08:55:14.971736+00:00",
      "latest_analyze_seen": "2026-11-02T08:55:14.971736+00:00",
      "checked_at": "2026-11-02T09:45:31.364725+00:00",
      "rows_method": "exact_count",
      "rows": 223,
      "count_checked_at": "2026-11-02T09:45:34.697623+00:00",
      "exact_count_status": "success"
    },
    "disability_welfare_facilities": {
      "table_name": "disability_welfare_facilities",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 206508,
      "unknown_row_estimates": 0,
      "heap_bytes": 402497536,
      "data_bytes": 402644992,
      "index_bytes": 44957696,
      "total_bytes": 447602688,
      "oldest_analyze_seen": "2026-10-19T21:24:00.711968+00:00",
      "latest_analyze_seen": "2026-10-19T21:24:00.711968+00:00",
      "checked_at": "2026-11-02T09:45:31.364728+00:00",
      "rows_method": "statistics_estimate",
      "rows": 206508,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "edinet_filings": {
      "table_name": "edinet_filings",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 407650,
      "unknown_row_estimates": 0,
      "heap_bytes": 189292544,
      "data_bytes": 189374464,
      "index_bytes": 43081728,
      "total_bytes": 232456192,
      "oldest_analyze_seen": "2026-10-31T21:00:17.496414+00:00",
      "latest_analyze_seen": "2026-10-31T21:00:17.496414+00:00",
      "checked_at": "2026-11-02T09:45:31.364731+00:00",
      "rows_method": "statistics_estimate",
      "rows": 407650,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "entity_resolution_cache": {
      "table_name": "entity_resolution_cache",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 69142,
      "unknown_row_estimates": 0,
      "heap_bytes": 8896512,
      "data_bytes": 8937472,
      "index_bytes": 20193280,
      "total_bytes": 29130752,
      "oldest_analyze_seen": "2026-05-26T20:44:39.629603+00:00",
      "latest_analyze_seen": "2026-05-26T20:44:39.629603+00:00",
      "checked_at": "2026-11-02T09:45:31.364734+00:00",
      "rows_method": "statistics_estimate",
      "rows": 69142,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "executive_compensation": {
      "table_name": "executive_compensation",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 24576,
      "total_bytes": 32768,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364737+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:34.813431+00:00",
      "exact_count_status": "success"
    },
    "external_data_source_discoveries": {
      "table_name": "external_data_source_discoveries",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 8699,
      "unknown_row_estimates": 0,
      "heap_bytes": 27688960,
      "data_bytes": 205635584,
      "index_bytes": 64274432,
      "total_bytes": 269910016,
      "oldest_analyze_seen": "2026-10-27T18:43:06.196763+00:00",
      "latest_analyze_seen": "2026-10-27T18:43:06.196763+00:00",
      "checked_at": "2026-11-02T09:45:31.36474+00:00",
      "rows_method": "statistics_estimate",
      "rows": 8699,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "field_lineage": {
      "table_name": "field_lineage",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1261,
      "unknown_row_estimates": 0,
      "heap_bytes": 286720,
      "data_bytes": 327680,
      "index_bytes": 270336,
      "total_bytes": 598016,
      "oldest_analyze_seen": "2026-05-17T02:28:22.822818+00:00",
      "latest_analyze_seen": "2026-05-17T02:28:22.822818+00:00",
      "checked_at": "2026-11-02T09:45:31.364743+00:00",
      "rows_method": "exact_count",
      "rows": 1261,
      "count_checked_at": "2026-11-02T09:45:34.963185+00:00",
      "exact_count_status": "success"
    },
    "financial_statements": {
      "table_name": "financial_statements",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 40126,
      "unknown_row_estimates": 0,
      "heap_bytes": 7905280,
      "data_bytes": 7946240,
      "index_bytes": 7069696,
      "total_bytes": 15015936,
      "oldest_analyze_seen": "2026-10-24T19:56:26.440836+00:00",
      "latest_analyze_seen": "2026-10-24T19:56:26.440836+00:00",
      "checked_at": "2026-11-02T09:45:31.364746+00:00",
      "rows_method": "statistics_estimate",
      "rows": 40126,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "food_business_licenses": {
      "table_name": "food_business_licenses",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 525207,
      "unknown_row_estimates": 0,
      "heap_bytes": 136650752,
      "data_bytes": 136724480,
      "index_bytes": 78020608,
      "total_bytes": 214745088,
      "oldest_analyze_seen": "2026-10-31T20:02:21.244443+00:00",
      "latest_analyze_seen": "2026-10-31T20:02:21.244443+00:00",
      "checked_at": "2026-11-02T09:45:31.364749+00:00",
      "rows_method": "statistics_estimate",
      "rows": 525207,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "gbizinfo_html_done": {
      "table_name": "gbizinfo_html_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5081962,
      "unknown_row_estimates": 0,
      "heap_bytes": 340533248,
      "data_bytes": 340656128,
      "index_bytes": 268935168,
      "total_bytes": 609591296,
      "oldest_analyze_seen": "2026-05-29T14:10:49.816639+00:00",
      "latest_analyze_seen": "2026-05-29T14:10:49.816639+00:00",
      "checked_at": "2026-11-02T09:45:31.364752+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5081962,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "gbizinfo_representative_done": {
      "table_name": "gbizinfo_representative_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 750,
      "unknown_row_estimates": 0,
      "heap_bytes": 57344,
      "data_bytes": 98304,
      "index_bytes": 81920,
      "total_bytes": 180224,
      "oldest_analyze_seen": "2026-05-30T02:54:56.223859+00:00",
      "latest_analyze_seen": "2026-05-30T02:54:56.223859+00:00",
      "checked_at": "2026-11-02T09:45:31.364755+00:00",
      "rows_method": "exact_count",
      "rows": 750,
      "count_checked_at": "2026-11-02T09:45:35.041567+00:00",
      "exact_count_status": "success"
    },
    "geps_representative_done": {
      "table_name": "geps_representative_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 27886,
      "unknown_row_estimates": 0,
      "heap_bytes": 4177920,
      "data_bytes": 4218880,
      "index_bytes": 2842624,
      "total_bytes": 7061504,
      "oldest_analyze_seen": "2026-06-09T18:24:27.571096+00:00",
      "latest_analyze_seen": "2026-06-09T18:24:27.571096+00:00",
      "checked_at": "2026-11-02T09:45:31.364759+00:00",
      "rows_method": "exact_count",
      "rows": 27886,
      "count_checked_at": "2026-11-02T09:45:35.213343+00:00",
      "exact_count_status": "success"
    },
    "gis_facility_points": {
      "table_name": "gis_facility_points",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 145435,
      "unknown_row_estimates": 0,
      "heap_bytes": 103522304,
      "data_bytes": 103587840,
      "index_bytes": 35610624,
      "total_bytes": 139198464,
      "oldest_analyze_seen": "2026-05-21T08:32:04.7038+00:00",
      "latest_analyze_seen": "2026-05-21T08:32:04.7038+00:00",
      "checked_at": "2026-11-02T09:45:31.364762+00:00",
      "rows_method": "statistics_estimate",
      "rows": 145435,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "gis_zone_polygons": {
      "table_name": "gis_zone_polygons",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 137224,
      "unknown_row_estimates": 0,
      "heap_bytes": 162856960,
      "data_bytes": 183435264,
      "index_bytes": 46563328,
      "total_bytes": 229998592,
      "oldest_analyze_seen": "2026-05-24T07:57:58.490827+00:00",
      "latest_analyze_seen": "2026-05-24T07:57:58.490827+00:00",
      "checked_at": "2026-11-02T09:45:31.364765+00:00",
      "rows_method": "statistics_estimate",
      "rows": 137224,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "gov_revolving_door": {
      "table_name": "gov_revolving_door",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 51,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 65536,
      "total_bytes": 114688,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364768+00:00",
      "rows_method": "exact_count",
      "rows": 51,
      "count_checked_at": "2026-11-02T09:45:35.283761+00:00",
      "exact_count_status": "success"
    },
    "government_contracts": {
      "table_name": "government_contracts",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 546288,
      "unknown_row_estimates": 0,
      "heap_bytes": 271376384,
      "data_bytes": 271482880,
      "index_bytes": 67231744,
      "total_bytes": 338714624,
      "oldest_analyze_seen": "2026-10-06T20:06:04.350071+00:00",
      "latest_analyze_seen": "2026-10-06T20:06:04.350071+00:00",
      "checked_at": "2026-11-02T09:45:31.36477+00:00",
      "rows_method": "statistics_estimate",
      "rows": 546288,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "government_procurement_suspensions": {
      "table_name": "government_procurement_suspensions",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 597,
      "unknown_row_estimates": 0,
      "heap_bytes": 24215552,
      "data_bytes": 26648576,
      "index_bytes": 1269760,
      "total_bytes": 27918336,
      "oldest_analyze_seen": "2026-11-01T23:11:47.306119+00:00",
      "latest_analyze_seen": "2026-11-01T23:11:47.306119+00:00",
      "checked_at": "2026-11-02T09:45:31.364773+00:00",
      "rows_method": "statistics_estimate",
      "rows": 597,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "hotel_ryokan_registry": {
      "table_name": "hotel_ryokan_registry",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 2393,
      "unknown_row_estimates": 0,
      "heap_bytes": 1736704,
      "data_bytes": 1777664,
      "index_bytes": 1638400,
      "total_bytes": 3416064,
      "oldest_analyze_seen": "2026-09-30T20:05:23.882711+00:00",
      "latest_analyze_seen": "2026-09-30T20:05:23.882711+00:00",
      "checked_at": "2026-11-02T09:45:31.364776+00:00",
      "rows_method": "exact_count",
      "rows": 2393,
      "count_checked_at": "2026-11-02T09:45:35.367981+00:00",
      "exact_count_status": "success"
    },
    "intellectual_properties": {
      "table_name": "intellectual_properties",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 426926,
      "unknown_row_estimates": 0,
      "heap_bytes": 273866752,
      "data_bytes": 274030592,
      "index_bytes": 100966400,
      "total_bytes": 374996992,
      "oldest_analyze_seen": "2026-06-10T16:50:51.996491+00:00",
      "latest_analyze_seen": "2026-06-10T16:50:51.996491+00:00",
      "checked_at": "2026-11-02T09:45:31.364779+00:00",
      "rows_method": "statistics_estimate",
      "rows": 426926,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "invoice_registrants": {
      "table_name": "invoice_registrants",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5141621,
      "unknown_row_estimates": 0,
      "heap_bytes": 984326144,
      "data_bytes": 984629248,
      "index_bytes": 1010655232,
      "total_bytes": 1995284480,
      "oldest_analyze_seen": "2026-05-19T17:11:16.775062+00:00",
      "latest_analyze_seen": "2026-05-19T17:11:16.775062+00:00",
      "checked_at": "2026-11-02T09:45:31.364782+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5141621,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "ipa_security_action_declarations": {
      "table_name": "ipa_security_action_declarations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 434096,
      "unknown_row_estimates": 0,
      "heap_bytes": 709984256,
      "data_bytes": 710213632,
      "index_bytes": 186793984,
      "total_bytes": 897007616,
      "oldest_analyze_seen": "2026-10-02T21:07:49.132448+00:00",
      "latest_analyze_seen": "2026-10-02T21:07:49.132448+00:00",
      "checked_at": "2026-11-02T09:45:31.364785+00:00",
      "rows_method": "statistics_estimate",
      "rows": 434096,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "jetro_case_studies": {
      "table_name": "jetro_case_studies",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 624,
      "unknown_row_estimates": 0,
      "heap_bytes": 2269184,
      "data_bytes": 6676480,
      "index_bytes": 778240,
      "total_bytes": 7454720,
      "oldest_analyze_seen": "2026-10-02T23:33:48.782547+00:00",
      "latest_analyze_seen": "2026-10-02T23:33:48.782547+00:00",
      "checked_at": "2026-11-02T09:45:31.364788+00:00",
      "rows_method": "exact_count",
      "rows": 624,
      "count_checked_at": "2026-11-02T09:45:35.453792+00:00",
      "exact_count_status": "success"
    },
    "jftc_subcontract_recommendations": {
      "table_name": "jftc_subcontract_recommendations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 136,
      "unknown_row_estimates": 0,
      "heap_bytes": 491520,
      "data_bytes": 622592,
      "index_bytes": 106496,
      "total_bytes": 729088,
      "oldest_analyze_seen": "2026-09-02T22:55:51.724152+00:00",
      "latest_analyze_seen": "2026-09-02T22:55:51.724152+00:00",
      "checked_at": "2026-11-02T09:45:31.364791+00:00",
      "rows_method": "exact_count",
      "rows": 136,
      "count_checked_at": "2026-11-02T09:45:35.521489+00:00",
      "exact_count_status": "success"
    },
    "jgoodtech_company_profiles": {
      "table_name": "jgoodtech_company_profiles",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 39563,
      "unknown_row_estimates": 0,
      "heap_bytes": 80797696,
      "data_bytes": 371539968,
      "index_bytes": 13647872,
      "total_bytes": 385187840,
      "oldest_analyze_seen": "2026-06-08T20:03:29.780986+00:00",
      "latest_analyze_seen": "2026-06-08T20:03:29.780986+00:00",
      "checked_at": "2026-11-02T09:45:31.364794+00:00",
      "rows_method": "statistics_estimate",
      "rows": 39563,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "jgoodtech_representative_done": {
      "table_name": "jgoodtech_representative_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 40325,
      "unknown_row_estimates": 0,
      "heap_bytes": 7421952,
      "data_bytes": 7462912,
      "index_bytes": 3137536,
      "total_bytes": 10600448,
      "oldest_analyze_seen": "2026-08-04T20:27:35.40393+00:00",
      "latest_analyze_seen": "2026-08-04T20:27:35.40393+00:00",
      "checked_at": "2026-11-02T09:45:31.364798+00:00",
      "rows_method": "statistics_estimate",
      "rows": 40325,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "jpo_trademark_enrichment": {
      "table_name": "jpo_trademark_enrichment",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 48020,
      "unknown_row_estimates": 0,
      "heap_bytes": 67002368,
      "data_bytes": 166813696,
      "index_bytes": 6619136,
      "total_bytes": 173432832,
      "oldest_analyze_seen": "2026-06-10T18:41:54.294452+00:00",
      "latest_analyze_seen": "2026-06-10T18:41:54.294452+00:00",
      "checked_at": "2026-11-02T09:45:31.364801+00:00",
      "rows_method": "statistics_estimate",
      "rows": 48020,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kaigo_service_rep_done": {
      "table_name": "kaigo_service_rep_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 41018,
      "unknown_row_estimates": 0,
      "heap_bytes": 14688256,
      "data_bytes": 14729216,
      "index_bytes": 3686400,
      "total_bytes": 18415616,
      "oldest_analyze_seen": "2026-06-02T11:01:49.775474+00:00",
      "latest_analyze_seen": "2026-06-02T11:01:49.775474+00:00",
      "checked_at": "2026-11-02T09:45:31.364804+00:00",
      "rows_method": "statistics_estimate",
      "rows": 41018,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kaken_research_projects": {
      "table_name": "kaken_research_projects",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5586,
      "unknown_row_estimates": 0,
      "heap_bytes": 53633024,
      "data_bytes": 79364096,
      "index_bytes": 5267456,
      "total_bytes": 84631552,
      "oldest_analyze_seen": "2026-10-27T00:20:36.215584+00:00",
      "latest_analyze_seen": "2026-10-27T00:20:36.215584+00:00",
      "checked_at": "2026-11-02T09:45:31.364807+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5586,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kanpo_discovered_urls": {
      "table_name": "kanpo_discovered_urls",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 170413,
      "unknown_row_estimates": 0,
      "heap_bytes": 104431616,
      "data_bytes": 104497152,
      "index_bytes": 119480320,
      "total_bytes": 223977472,
      "oldest_analyze_seen": "2026-06-08T18:40:09.89539+00:00",
      "latest_analyze_seen": "2026-06-08T18:40:09.89539+00:00",
      "checked_at": "2026-11-02T09:45:31.36481+00:00",
      "rows_method": "statistics_estimate",
      "rows": 170413,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kanpo_downstream_links": {
      "table_name": "kanpo_downstream_links",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 302,
      "unknown_row_estimates": 0,
      "heap_bytes": 466944,
      "data_bytes": 507904,
      "index_bytes": 106496,
      "total_bytes": 614400,
      "oldest_analyze_seen": "2026-10-20T00:05:51.760378+00:00",
      "latest_analyze_seen": "2026-10-20T00:05:51.760378+00:00",
      "checked_at": "2026-11-02T09:45:31.364813+00:00",
      "rows_method": "exact_count",
      "rows": 304,
      "count_checked_at": "2026-11-02T09:45:35.723462+00:00",
      "exact_count_status": "success"
    },
    "kanpo_financial_facts": {
      "table_name": "kanpo_financial_facts",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 170427,
      "unknown_row_estimates": 0,
      "heap_bytes": 112484352,
      "data_bytes": 112549888,
      "index_bytes": 18268160,
      "total_bytes": 130818048,
      "oldest_analyze_seen": "2026-06-08T15:35:56.710473+00:00",
      "latest_analyze_seen": "2026-06-08T15:35:56.710473+00:00",
      "checked_at": "2026-11-02T09:45:31.364817+00:00",
      "rows_method": "statistics_estimate",
      "rows": 170427,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kanpo_issues": {
      "table_name": "kanpo_issues",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 160,
      "unknown_row_estimates": 0,
      "heap_bytes": 204800,
      "data_bytes": 245760,
      "index_bytes": 49152,
      "total_bytes": 294912,
      "oldest_analyze_seen": "2026-10-21T00:05:41.284953+00:00",
      "latest_analyze_seen": "2026-10-21T00:05:41.284953+00:00",
      "checked_at": "2026-11-02T09:45:31.36482+00:00",
      "rows_method": "exact_count",
      "rows": 160,
      "count_checked_at": "2026-11-02T09:45:35.803745+00:00",
      "exact_count_status": "success"
    },
    "kanpo_notice_entities": {
      "table_name": "kanpo_notice_entities",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 170427,
      "unknown_row_estimates": 0,
      "heap_bytes": 65167360,
      "data_bytes": 65216512,
      "index_bytes": 20824064,
      "total_bytes": 86040576,
      "oldest_analyze_seen": "2026-06-08T15:21:11.895527+00:00",
      "latest_analyze_seen": "2026-06-08T15:21:11.895527+00:00",
      "checked_at": "2026-11-02T09:45:31.364823+00:00",
      "rows_method": "statistics_estimate",
      "rows": 170427,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kanpo_notices": {
      "table_name": "kanpo_notices",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 176062,
      "unknown_row_estimates": 0,
      "heap_bytes": 300728320,
      "data_bytes": 300941312,
      "index_bytes": 184803328,
      "total_bytes": 485744640,
      "oldest_analyze_seen": "2026-10-10T00:09:46.344053+00:00",
      "latest_analyze_seen": "2026-10-10T00:09:46.344053+00:00",
      "checked_at": "2026-11-02T09:45:31.364826+00:00",
      "rows_method": "statistics_estimate",
      "rows": 176062,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "kanpo_source_records": {
      "table_name": "kanpo_source_records",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 177233,
      "unknown_row_estimates": 0,
      "heap_bytes": 330366976,
      "data_bytes": 333324288,
      "index_bytes": 35864576,
      "total_bytes": 369188864,
      "oldest_analyze_seen": "2026-10-10T00:09:11.42444+00:00",
      "latest_analyze_seen": "2026-10-10T00:09:11.42444+00:00",
      "checked_at": "2026-11-02T09:45:31.364829+00:00",
      "rows_method": "statistics_estimate",
      "rows": 177233,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "land_prices": {
      "table_name": "land_prices",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5558,
      "unknown_row_estimates": 0,
      "heap_bytes": 2080768,
      "data_bytes": 2121728,
      "index_bytes": 1024000,
      "total_bytes": 3145728,
      "oldest_analyze_seen": "2026-05-21T08:06:33.915511+00:00",
      "latest_analyze_seen": "2026-05-21T08:06:33.915511+00:00",
      "checked_at": "2026-11-02T09:45:31.364832+00:00",
      "rows_method": "exact_count",
      "rows": 5558,
      "count_checked_at": "2026-11-02T09:45:35.894105+00:00",
      "exact_count_status": "success"
    },
    "laws": {
      "table_name": "laws",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 95521,
      "unknown_row_estimates": 0,
      "heap_bytes": 208388096,
      "data_bytes": 208478208,
      "index_bytes": 10248192,
      "total_bytes": 218726400,
      "oldest_analyze_seen": "2026-11-02T08:01:30.315395+00:00",
      "latest_analyze_seen": "2026-11-02T08:01:30.315395+00:00",
      "checked_at": "2026-11-02T09:45:31.364835+00:00",
      "rows_method": "statistics_estimate",
      "rows": 95521,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "legal_registry_requests": {
      "table_name": "legal_registry_requests",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3002,
      "unknown_row_estimates": 0,
      "heap_bytes": 6144000,
      "data_bytes": 6275072,
      "index_bytes": 647168,
      "total_bytes": 6922240,
      "oldest_analyze_seen": "2026-05-30T19:51:44.327948+00:00",
      "latest_analyze_seen": "2026-05-30T19:51:44.327948+00:00",
      "checked_at": "2026-11-02T09:45:31.364838+00:00",
      "rows_method": "exact_count",
      "rows": 3002,
      "count_checked_at": "2026-11-02T09:45:36.051539+00:00",
      "exact_count_status": "success"
    },
    "local_public_recognition_root_runs": {
      "table_name": "local_public_recognition_root_runs",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 19411,
      "unknown_row_estimates": 0,
      "heap_bytes": 6160384,
      "data_bytes": 6201344,
      "index_bytes": 3751936,
      "total_bytes": 9953280,
      "oldest_analyze_seen": "2026-10-31T00:36:38.638398+00:00",
      "latest_analyze_seen": "2026-10-31T00:36:38.638398+00:00",
      "checked_at": "2026-11-02T09:45:31.364841+00:00",
      "rows_method": "statistics_estimate",
      "rows": 19411,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "local_public_recognitions": {
      "table_name": "local_public_recognitions",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 27035,
      "unknown_row_estimates": 0,
      "heap_bytes": 23650304,
      "data_bytes": 24223744,
      "index_bytes": 9273344,
      "total_bytes": 33497088,
      "oldest_analyze_seen": "2026-08-06T00:37:59.720026+00:00",
      "latest_analyze_seen": "2026-08-06T00:37:59.720026+00:00",
      "checked_at": "2026-11-02T09:45:31.364844+00:00",
      "rows_method": "statistics_estimate",
      "rows": 27035,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "material_disclosures": {
      "table_name": "material_disclosures",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 24576,
      "total_bytes": 32768,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364848+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:36.173512+00:00",
      "exact_count_status": "success"
    },
    "medical_facilities": {
      "table_name": "medical_facilities",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 137613,
      "unknown_row_estimates": 0,
      "heap_bytes": 137830400,
      "data_bytes": 137904128,
      "index_bytes": 50692096,
      "total_bytes": 188596224,
      "oldest_analyze_seen": "2026-10-09T03:09:36.604411+00:00",
      "latest_analyze_seen": "2026-10-09T03:09:36.604411+00:00",
      "checked_at": "2026-11-02T09:45:31.364851+00:00",
      "rows_method": "statistics_estimate",
      "rows": 137613,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "moj_e_koukoku_notice_documents": {
      "table_name": "moj_e_koukoku_notice_documents",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 20,
      "unknown_row_estimates": 0,
      "heap_bytes": 32768,
      "data_bytes": 147456,
      "index_bytes": 147456,
      "total_bytes": 294912,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364854+00:00",
      "rows_method": "exact_count",
      "rows": 20,
      "count_checked_at": "2026-11-02T09:45:36.259374+00:00",
      "exact_count_status": "success"
    },
    "moj_e_koukoku_notices": {
      "table_name": "moj_e_koukoku_notices",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5120,
      "unknown_row_estimates": 0,
      "heap_bytes": 53706752,
      "data_bytes": 53755904,
      "index_bytes": 7610368,
      "total_bytes": 61366272,
      "oldest_analyze_seen": "2026-11-02T09:20:16.872689+00:00",
      "latest_analyze_seen": "2026-11-02T09:20:16.872689+00:00",
      "checked_at": "2026-11-02T09:45:31.364856+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5120,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "municipalities_lookup": {
      "table_name": "municipalities_lookup",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1920,
      "unknown_row_estimates": 0,
      "heap_bytes": 122880,
      "data_bytes": 155648,
      "index_bytes": 106496,
      "total_bytes": 262144,
      "oldest_analyze_seen": "2026-05-21T07:39:00.347377+00:00",
      "latest_analyze_seen": "2026-05-21T07:39:00.347377+00:00",
      "checked_at": "2026-11-02T09:45:31.364859+00:00",
      "rows_method": "exact_count",
      "rows": 1920,
      "count_checked_at": "2026-11-02T09:45:36.353680+00:00",
      "exact_count_status": "success"
    },
    "mv_company_risk_summary": {
      "table_name": "mv_company_risk_summary",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 0,
      "index_bytes": 8192,
      "total_bytes": 8192,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364862+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:36.460618+00:00",
      "exact_count_status": "success"
    },
    "news_mentions": {
      "table_name": "news_mentions",
      "relkind": "p",
      "physical_relations": 2,
      "estimated_rows": 295446,
      "unknown_row_estimates": 0,
      "heap_bytes": 376291328,
      "data_bytes": 376438784,
      "index_bytes": 411607040,
      "total_bytes": 788045824,
      "oldest_analyze_seen": "2026-11-02T04:53:58.188347+00:00",
      "latest_analyze_seen": "2026-11-02T04:53:58.188347+00:00",
      "checked_at": "2026-11-02T09:45:31.364865+00:00",
      "rows_method": "statistics_estimate",
      "rows": 295446,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "news_mentions_2026": {
      "table_name": "news_mentions_2026",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 295446,
      "unknown_row_estimates": 0,
      "heap_bytes": 376291328,
      "data_bytes": 376430592,
      "index_bytes": 411566080,
      "total_bytes": 787996672,
      "oldest_analyze_seen": "2026-11-02T04:53:58.188347+00:00",
      "latest_analyze_seen": "2026-11-02T04:53:58.188347+00:00",
      "checked_at": "2026-11-02T09:45:31.364868+00:00",
      "rows_method": "statistics_estimate",
      "rows": 295446,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "news_mentions_default": {
      "table_name": "news_mentions_default",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 40960,
      "total_bytes": 49152,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.364871+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:36.583343+00:00",
      "exact_count_status": "success"
    },
    "nintei_shien_kikan_records": {
      "table_name": "nintei_shien_kikan_records",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 32739,
      "unknown_row_estimates": 0,
      "heap_bytes": 131809280,
      "data_bytes": 135987200,
      "index_bytes": 12279808,
      "total_bytes": 148267008,
      "oldest_analyze_seen": "2026-10-02T23:08:33.589059+00:00",
      "latest_analyze_seen": "2026-10-02T23:08:33.589059+00:00",
      "checked_at": "2026-11-02T09:45:31.364874+00:00",
      "rows_method": "statistics_estimate",
      "rows": 32739,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "npo_facilities": {
      "table_name": "npo_facilities",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 2010,
      "unknown_row_estimates": 0,
      "heap_bytes": 3244032,
      "data_bytes": 3383296,
      "index_bytes": 17088512,
      "total_bytes": 20471808,
      "oldest_analyze_seen": "2026-05-12T16:08:44.578317+00:00",
      "latest_analyze_seen": "2026-05-12T16:08:44.578317+00:00",
      "checked_at": "2026-11-02T09:45:31.364877+00:00",
      "rows_method": "statistics_estimate",
      "rows": 2010,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "officers": {
      "table_name": "officers",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 820644,
      "unknown_row_estimates": 0,
      "heap_bytes": 274391040,
      "data_bytes": 274505728,
      "index_bytes": 226459648,
      "total_bytes": 500965376,
      "oldest_analyze_seen": "2026-06-09T18:09:11.770147+00:00",
      "latest_analyze_seen": "2026-06-09T18:09:11.770147+00:00",
      "checked_at": "2026-11-02T09:45:31.36488+00:00",
      "rows_method": "statistics_estimate",
      "rows": 820644,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "partnership_declaration_pdf_done": {
      "table_name": "partnership_declaration_pdf_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3680,
      "unknown_row_estimates": 0,
      "heap_bytes": 1941504,
      "data_bytes": 1982464,
      "index_bytes": 7069696,
      "total_bytes": 9052160,
      "oldest_analyze_seen": "2026-10-05T22:27:46.374496+00:00",
      "latest_analyze_seen": "2026-10-05T22:27:46.374496+00:00",
      "checked_at": "2026-11-02T09:45:31.364885+00:00",
      "rows_method": "statistics_estimate",
      "rows": 3680,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "person_career_trajectory": {
      "table_name": "person_career_trajectory",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 154118,
      "unknown_row_estimates": 0,
      "heap_bytes": 53420032,
      "data_bytes": 53526528,
      "index_bytes": 5652480,
      "total_bytes": 59179008,
      "oldest_analyze_seen": "2026-05-15T17:33:32.171429+00:00",
      "latest_analyze_seen": "2026-05-15T17:33:32.171429+00:00",
      "checked_at": "2026-11-02T09:45:31.364888+00:00",
      "rows_method": "statistics_estimate",
      "rows": 154118,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "person_co_occurrence": {
      "table_name": "person_co_occurrence",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 525,
      "unknown_row_estimates": 0,
      "heap_bytes": 81920,
      "data_bytes": 122880,
      "index_bytes": 81920,
      "total_bytes": 204800,
      "oldest_analyze_seen": "2026-05-15T17:33:32.178874+00:00",
      "latest_analyze_seen": "2026-05-15T17:33:32.178874+00:00",
      "checked_at": "2026-11-02T09:45:31.364891+00:00",
      "rows_method": "exact_count",
      "rows": 525,
      "count_checked_at": "2026-11-02T09:45:36.703607+00:00",
      "exact_count_status": "success"
    },
    "person_multi_license": {
      "table_name": "person_multi_license",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3070,
      "unknown_row_estimates": 0,
      "heap_bytes": 737280,
      "data_bytes": 778240,
      "index_bytes": 131072,
      "total_bytes": 909312,
      "oldest_analyze_seen": "2026-05-15T17:17:33.649462+00:00",
      "latest_analyze_seen": "2026-05-15T17:17:33.649462+00:00",
      "checked_at": "2026-11-02T09:45:31.364894+00:00",
      "rows_method": "exact_count",
      "rows": 3070,
      "count_checked_at": "2026-11-02T09:45:36.813090+00:00",
      "exact_count_status": "success"
    },
    "person_officer_stats": {
      "table_name": "person_officer_stats",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 39352,
      "unknown_row_estimates": 0,
      "heap_bytes": 11288576,
      "data_bytes": 11329536,
      "index_bytes": 11362304,
      "total_bytes": 22691840,
      "oldest_analyze_seen": "2026-05-13T16:07:59.659987+00:00",
      "latest_analyze_seen": "2026-05-13T16:07:59.659987+00:00",
      "checked_at": "2026-11-02T09:45:31.364897+00:00",
      "rows_method": "statistics_estimate",
      "rows": 39352,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "person_profile": {
      "table_name": "person_profile",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 159095,
      "unknown_row_estimates": 0,
      "heap_bytes": 41443328,
      "data_bytes": 41492480,
      "index_bytes": 6955008,
      "total_bytes": 48447488,
      "oldest_analyze_seen": "2026-05-15T17:22:31.17749+00:00",
      "latest_analyze_seen": "2026-05-15T17:22:31.17749+00:00",
      "checked_at": "2026-11-02T09:45:31.3649+00:00",
      "rows_method": "statistics_estimate",
      "rows": 159095,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "person_serial_entrepreneur": {
      "table_name": "person_serial_entrepreneur",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3694,
      "unknown_row_estimates": 0,
      "heap_bytes": 761856,
      "data_bytes": 802816,
      "index_bytes": 155648,
      "total_bytes": 958464,
      "oldest_analyze_seen": "2026-05-15T17:22:31.228106+00:00",
      "latest_analyze_seen": "2026-05-15T17:22:31.228106+00:00",
      "checked_at": "2026-11-02T09:45:31.364902+00:00",
      "rows_method": "exact_count",
      "rows": 3694,
      "count_checked_at": "2026-11-02T09:45:36.909652+00:00",
      "exact_count_status": "success"
    },
    "person_shared_address": {
      "table_name": "person_shared_address",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 5534,
      "unknown_row_estimates": 0,
      "heap_bytes": 1335296,
      "data_bytes": 1376256,
      "index_bytes": 598016,
      "total_bytes": 1974272,
      "oldest_analyze_seen": "2026-05-15T17:35:45.815567+00:00",
      "latest_analyze_seen": "2026-05-15T17:35:45.815567+00:00",
      "checked_at": "2026-11-02T09:45:31.364905+00:00",
      "rows_method": "exact_count",
      "rows": 5534,
      "count_checked_at": "2026-11-02T09:45:37.025169+00:00",
      "exact_count_status": "success"
    },
    "persons": {
      "table_name": "persons",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 931185,
      "unknown_row_estimates": 0,
      "heap_bytes": 194625536,
      "data_bytes": 194707456,
      "index_bytes": 265854976,
      "total_bytes": 460562432,
      "oldest_analyze_seen": "2026-07-04T20:49:06.718122+00:00",
      "latest_analyze_seen": "2026-07-04T20:49:06.718122+00:00",
      "checked_at": "2026-11-02T09:45:31.364908+00:00",
      "rows_method": "statistics_estimate",
      "rows": 931185,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "pharmacy_registry": {
      "table_name": "pharmacy_registry",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 3340,
      "unknown_row_estimates": 0,
      "heap_bytes": 1212416,
      "data_bytes": 1253376,
      "index_bytes": 2359296,
      "total_bytes": 3612672,
      "oldest_analyze_seen": "2026-10-10T03:05:15.56873+00:00",
      "latest_analyze_seen": "2026-10-10T03:05:15.56873+00:00",
      "checked_at": "2026-11-02T09:45:31.364911+00:00",
      "rows_method": "exact_count",
      "rows": 3340,
      "count_checked_at": "2026-11-02T09:45:37.113819+00:00",
      "exact_count_status": "success"
    },
    "political_donations": {
      "table_name": "political_donations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 705,
      "unknown_row_estimates": 0,
      "heap_bytes": 344064,
      "data_bytes": 385024,
      "index_bytes": 311296,
      "total_bytes": 696320,
      "oldest_analyze_seen": "2026-05-13T19:16:56.768425+00:00",
      "latest_analyze_seen": "2026-05-13T19:16:56.768425+00:00",
      "checked_at": "2026-11-02T09:45:31.364914+00:00",
      "rows_method": "exact_count",
      "rows": 705,
      "count_checked_at": "2026-11-02T09:45:37.203931+00:00",
      "exact_count_status": "success"
    },
    "political_organization_reports": {
      "table_name": "political_organization_reports",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 7828,
      "unknown_row_estimates": 0,
      "heap_bytes": 7266304,
      "data_bytes": 7364608,
      "index_bytes": 3784704,
      "total_bytes": 11149312,
      "oldest_analyze_seen": "2026-10-05T19:43:40.440958+00:00",
      "latest_analyze_seen": "2026-10-05T19:43:40.440958+00:00",
      "checked_at": "2026-11-02T09:45:31.364918+00:00",
      "rows_method": "statistics_estimate",
      "rows": 7828,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "politician_corporate_links": {
      "table_name": "politician_corporate_links",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 36,
      "unknown_row_estimates": 0,
      "heap_bytes": 16384,
      "data_bytes": 57344,
      "index_bytes": 65536,
      "total_bytes": 122880,
      "oldest_analyze_seen": "2026-05-13T15:43:01.116397+00:00",
      "latest_analyze_seen": "2026-05-13T15:43:01.116397+00:00",
      "checked_at": "2026-11-02T09:45:31.364921+00:00",
      "rows_method": "exact_count",
      "rows": 36,
      "count_checked_at": "2026-11-02T09:45:37.322673+00:00",
      "exact_count_status": "success"
    },
    "politicians": {
      "table_name": "politicians",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 4518,
      "unknown_row_estimates": 0,
      "heap_bytes": 1081344,
      "data_bytes": 1122304,
      "index_bytes": 671744,
      "total_bytes": 1794048,
      "oldest_analyze_seen": "2026-10-14T05:00:47.342077+00:00",
      "latest_analyze_seen": "2026-10-14T05:00:47.342077+00:00",
      "checked_at": "2026-11-02T09:45:31.364924+00:00",
      "rows_method": "exact_count",
      "rows": 4518,
      "count_checked_at": "2026-11-02T09:45:37.404029+00:00",
      "exact_count_status": "success"
    },
    "population_mesh_250m": {
      "table_name": "population_mesh_250m",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 76017,
      "unknown_row_estimates": 0,
      "heap_bytes": 21184512,
      "data_bytes": 429211648,
      "index_bytes": 7397376,
      "total_bytes": 436609024,
      "oldest_analyze_seen": "2026-05-21T08:38:47.926621+00:00",
      "latest_analyze_seen": "2026-05-21T08:38:47.926621+00:00",
      "checked_at": "2026-11-02T09:45:31.364927+00:00",
      "rows_method": "statistics_estimate",
      "rows": 76017,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "professionals": {
      "table_name": "professionals",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 120193,
      "unknown_row_estimates": 0,
      "heap_bytes": 164438016,
      "data_bytes": 170893312,
      "index_bytes": 46497792,
      "total_bytes": 217391104,
      "oldest_analyze_seen": "2026-11-02T01:58:35.864753+00:00",
      "latest_analyze_seen": "2026-11-02T01:58:35.864753+00:00",
      "checked_at": "2026-11-02T09:45:31.36493+00:00",
      "rows_method": "statistics_estimate",
      "rows": 120193,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "public_representative_clues": {
      "table_name": "public_representative_clues",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 33492,
      "unknown_row_estimates": 0,
      "heap_bytes": 27885568,
      "data_bytes": 28131328,
      "index_bytes": 12640256,
      "total_bytes": 40771584,
      "oldest_analyze_seen": "2026-06-15T10:46:29.322405+00:00",
      "latest_analyze_seen": "2026-06-15T10:46:29.322405+00:00",
      "checked_at": "2026-11-02T09:45:31.364933+00:00",
      "rows_method": "statistics_estimate",
      "rows": 33492,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "raw_documents": {
      "table_name": "raw_documents",
      "relkind": "p",
      "physical_relations": 3,
      "estimated_rows": 5175143,
      "unknown_row_estimates": 0,
      "heap_bytes": 3281805312,
      "data_bytes": 3285147648,
      "index_bytes": 1104273408,
      "total_bytes": 4389421056,
      "oldest_analyze_seen": "2026-05-12T05:05:49.45715+00:00",
      "latest_analyze_seen": "2026-11-02T02:06:10.432682+00:00",
      "checked_at": "2026-11-02T09:45:31.364936+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5175143,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "raw_documents_2026_05": {
      "table_name": "raw_documents_2026_05",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1116836,
      "unknown_row_estimates": 0,
      "heap_bytes": 631185408,
      "data_bytes": 631390208,
      "index_bytes": 287899648,
      "total_bytes": 919289856,
      "oldest_analyze_seen": "2026-05-12T05:05:52.459404+00:00",
      "latest_analyze_seen": "2026-05-31T19:05:03.649216+00:00",
      "checked_at": "2026-11-02T09:45:31.364939+00:00",
      "rows_method": "statistics_estimate",
      "rows": 1116836,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "raw_documents_2026_06": {
      "table_name": "raw_documents_2026_06",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1062414,
      "unknown_row_estimates": 0,
      "heap_bytes": 826826752,
      "data_bytes": 827088896,
      "index_bytes": 229638144,
      "total_bytes": 1056727040,
      "oldest_analyze_seen": "2026-05-12T05:05:52.475606+00:00",
      "latest_analyze_seen": "2026-06-30T18:28:36.622993+00:00",
      "checked_at": "2026-11-02T09:45:31.364942+00:00",
      "rows_method": "statistics_estimate",
      "rows": 1062414,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "raw_documents_default": {
      "table_name": "raw_documents_default",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 2995893,
      "unknown_row_estimates": 0,
      "heap_bytes": 1823793152,
      "data_bytes": 1826668544,
      "index_bytes": 586735616,
      "total_bytes": 2413404160,
      "oldest_analyze_seen": "2026-05-12T05:05:49.45715+00:00",
      "latest_analyze_seen": "2026-11-02T02:06:10.432682+00:00",
      "checked_at": "2026-11-02T09:45:31.364945+00:00",
      "rows_method": "statistics_estimate",
      "rows": 2995893,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "real_estate_transactions": {
      "table_name": "real_estate_transactions",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 4256125,
      "unknown_row_estimates": 0,
      "heap_bytes": 810483712,
      "data_bytes": 810745856,
      "index_bytes": 748306432,
      "total_bytes": 1559052288,
      "oldest_analyze_seen": "2026-07-29T09:21:05.362098+00:00",
      "latest_analyze_seen": "2026-07-29T09:21:05.362098+00:00",
      "checked_at": "2026-11-02T09:45:31.364948+00:00",
      "rows_method": "statistics_estimate",
      "rows": 4256125,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "risk_events": {
      "table_name": "risk_events",
      "relkind": "p",
      "physical_relations": 4,
      "estimated_rows": 205367,
      "unknown_row_estimates": 0,
      "heap_bytes": 1472126976,
      "data_bytes": 1563271168,
      "index_bytes": 319873024,
      "total_bytes": 1883144192,
      "oldest_analyze_seen": "2026-11-01T18:19:02.937758+00:00",
      "latest_analyze_seen": "2026-11-01T22:14:10.780449+00:00",
      "checked_at": "2026-11-02T09:45:31.364951+00:00",
      "rows_method": "statistics_estimate",
      "rows": 205367,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "risk_events_2024": {
      "table_name": "risk_events_2024",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 9330,
      "unknown_row_estimates": 0,
      "heap_bytes": 61415424,
      "data_bytes": 68354048,
      "index_bytes": 13303808,
      "total_bytes": 81657856,
      "oldest_analyze_seen": "2026-11-01T18:19:02.937758+00:00",
      "latest_analyze_seen": "2026-11-01T18:19:02.937758+00:00",
      "checked_at": "2026-11-02T09:45:31.364954+00:00",
      "rows_method": "statistics_estimate",
      "rows": 9330,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "risk_events_2025": {
      "table_name": "risk_events_2025",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 9323,
      "unknown_row_estimates": 0,
      "heap_bytes": 139493376,
      "data_bytes": 163749888,
      "index_bytes": 28704768,
      "total_bytes": 192454656,
      "oldest_analyze_seen": "2026-11-01T22:14:10.780449+00:00",
      "latest_analyze_seen": "2026-11-01T22:14:10.780449+00:00",
      "checked_at": "2026-11-02T09:45:31.364957+00:00",
      "rows_method": "statistics_estimate",
      "rows": 9323,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "risk_events_2026": {
      "table_name": "risk_events_2026",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 103217,
      "unknown_row_estimates": 0,
      "heap_bytes": 635559936,
      "data_bytes": 656875520,
      "index_bytes": 155926528,
      "total_bytes": 812802048,
      "oldest_analyze_seen": "2026-11-01T18:19:50.208934+00:00",
      "latest_analyze_seen": "2026-11-01T18:19:50.208934+00:00",
      "checked_at": "2026-11-02T09:45:31.36496+00:00",
      "rows_method": "statistics_estimate",
      "rows": 103217,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "risk_events_default": {
      "table_name": "risk_events_default",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 83497,
      "unknown_row_estimates": 0,
      "heap_bytes": 635658240,
      "data_bytes": 674291712,
      "index_bytes": 121937920,
      "total_bytes": 796229632,
      "oldest_analyze_seen": "2026-11-01T21:45:42.469168+00:00",
      "latest_analyze_seen": "2026-11-01T21:45:42.469168+00:00",
      "checked_at": "2026-11-02T09:45:31.364963+00:00",
      "rows_method": "statistics_estimate",
      "rows": 83497,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "scheduler_runs": {
      "table_name": "scheduler_runs",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 30634,
      "unknown_row_estimates": 0,
      "heap_bytes": 29401088,
      "data_bytes": 29925376,
      "index_bytes": 5849088,
      "total_bytes": 35774464,
      "oldest_analyze_seen": "2026-10-30T20:00:01.79391+00:00",
      "latest_analyze_seen": "2026-10-30T20:00:01.79391+00:00",
      "checked_at": "2026-11-02T09:45:31.364966+00:00",
      "rows_method": "statistics_estimate",
      "rows": 30634,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "school_institution": {
      "table_name": "school_institution",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 60361,
      "unknown_row_estimates": 0,
      "heap_bytes": 28270592,
      "data_bytes": 28311552,
      "index_bytes": 22945792,
      "total_bytes": 51257344,
      "oldest_analyze_seen": "2026-05-13T01:04:57.245782+00:00",
      "latest_analyze_seen": "2026-05-13T01:04:57.245782+00:00",
      "checked_at": "2026-11-02T09:45:31.364969+00:00",
      "rows_method": "statistics_estimate",
      "rows": 60361,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_company_name_bucket_rank": {
      "table_name": "seo_company_name_bucket_rank",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 321118,
      "unknown_row_estimates": 0,
      "heap_bytes": 26894336,
      "data_bytes": 26935296,
      "index_bytes": 47112192,
      "total_bytes": 74047488,
      "oldest_analyze_seen": "2026-06-15T03:04:53.495985+00:00",
      "latest_analyze_seen": "2026-06-15T03:04:53.495985+00:00",
      "checked_at": "2026-11-02T09:45:31.364972+00:00",
      "rows_method": "statistics_estimate",
      "rows": 321118,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_company_name_index": {
      "table_name": "seo_company_name_index",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 5022138,
      "unknown_row_estimates": 0,
      "heap_bytes": 743366656,
      "data_bytes": 743604224,
      "index_bytes": 595091456,
      "total_bytes": 1338695680,
      "oldest_analyze_seen": "2026-06-15T03:04:22.052875+00:00",
      "latest_analyze_seen": "2026-06-15T03:04:22.052875+00:00",
      "checked_at": "2026-11-02T09:45:31.364975+00:00",
      "rows_method": "statistics_estimate",
      "rows": 5022138,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_company_priority_sitemap_index": {
      "table_name": "seo_company_priority_sitemap_index",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 88389,
      "unknown_row_estimates": 0,
      "heap_bytes": 8052736,
      "data_bytes": 8085504,
      "index_bytes": 12353536,
      "total_bytes": 20439040,
      "oldest_analyze_seen": "2026-06-15T03:03:49.177297+00:00",
      "latest_analyze_seen": "2026-06-15T03:03:49.177297+00:00",
      "checked_at": "2026-11-02T09:45:31.364978+00:00",
      "rows_method": "statistics_estimate",
      "rows": 88389,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_company_sitemap_prefixes": {
      "table_name": "seo_company_sitemap_prefixes",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 891,
      "unknown_row_estimates": 0,
      "heap_bytes": 73728,
      "data_bytes": 114688,
      "index_bytes": 57344,
      "total_bytes": 172032,
      "oldest_analyze_seen": "2026-06-15T03:05:33.745668+00:00",
      "latest_analyze_seen": "2026-06-15T03:05:33.745668+00:00",
      "checked_at": "2026-11-02T09:45:31.364981+00:00",
      "rows_method": "exact_count",
      "rows": 891,
      "count_checked_at": "2026-11-02T09:45:37.521520+00:00",
      "exact_count_status": "success"
    },
    "seo_invoice_sitemap_prefixes": {
      "table_name": "seo_invoice_sitemap_prefixes",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 990,
      "unknown_row_estimates": 0,
      "heap_bytes": 73728,
      "data_bytes": 114688,
      "index_bytes": 57344,
      "total_bytes": 172032,
      "oldest_analyze_seen": "2026-06-15T03:05:36.716773+00:00",
      "latest_analyze_seen": "2026-06-15T03:05:36.716773+00:00",
      "checked_at": "2026-11-02T09:45:31.364985+00:00",
      "rows_method": "exact_count",
      "rows": 990,
      "count_checked_at": "2026-11-02T09:45:37.673116+00:00",
      "exact_count_status": "success"
    },
    "seo_person_name_bucket_rank": {
      "table_name": "seo_person_name_bucket_rank",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 1341576,
      "unknown_row_estimates": 0,
      "heap_bytes": 93708288,
      "data_bytes": 93765632,
      "index_bytes": 129908736,
      "total_bytes": 223674368,
      "oldest_analyze_seen": "2026-06-15T03:06:29.375931+00:00",
      "latest_analyze_seen": "2026-06-15T03:06:29.375931+00:00",
      "checked_at": "2026-11-02T09:45:31.364988+00:00",
      "rows_method": "statistics_estimate",
      "rows": 1341576,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_person_name_index": {
      "table_name": "seo_person_name_index",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 882547,
      "unknown_row_estimates": 0,
      "heap_bytes": 116916224,
      "data_bytes": 116981760,
      "index_bytes": 83542016,
      "total_bytes": 200523776,
      "oldest_analyze_seen": "2026-06-15T03:05:57.723354+00:00",
      "latest_analyze_seen": "2026-06-15T03:05:57.723354+00:00",
      "checked_at": "2026-11-02T09:45:31.364991+00:00",
      "rows_method": "statistics_estimate",
      "rows": 882547,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_person_priority_index": {
      "table_name": "seo_person_priority_index",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 143816,
      "unknown_row_estimates": 0,
      "heap_bytes": 26214400,
      "data_bytes": 26255360,
      "index_bytes": 18169856,
      "total_bytes": 44425216,
      "oldest_analyze_seen": "2026-06-15T03:05:40.519623+00:00",
      "latest_analyze_seen": "2026-06-15T03:05:40.519623+00:00",
      "checked_at": "2026-11-02T09:45:31.364994+00:00",
      "rows_method": "statistics_estimate",
      "rows": 143816,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "seo_person_sitemap_prefixes": {
      "table_name": "seo_person_sitemap_prefixes",
      "relkind": "m",
      "physical_relations": 1,
      "estimated_rows": 93,
      "unknown_row_estimates": 0,
      "heap_bytes": 8192,
      "data_bytes": 49152,
      "index_bytes": 16384,
      "total_bytes": 65536,
      "oldest_analyze_seen": "2026-06-15T03:06:29.475386+00:00",
      "latest_analyze_seen": "2026-06-15T03:06:29.475386+00:00",
      "checked_at": "2026-11-02T09:45:31.364997+00:00",
      "rows_method": "exact_count",
      "rows": 93,
      "count_checked_at": "2026-11-02T09:45:37.755425+00:00",
      "exact_count_status": "success"
    },
    "shareholders": {
      "table_name": "shareholders",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 141181,
      "unknown_row_estimates": 0,
      "heap_bytes": 63029248,
      "data_bytes": 63078400,
      "index_bytes": 57901056,
      "total_bytes": 120979456,
      "oldest_analyze_seen": "2026-09-09T00:00:43.348272+00:00",
      "latest_analyze_seen": "2026-09-09T00:00:43.348272+00:00",
      "checked_at": "2026-11-02T09:45:31.365+00:00",
      "rows_method": "statistics_estimate",
      "rows": 141181,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "smart_sme_supporters": {
      "table_name": "smart_sme_supporters",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 981,
      "unknown_row_estimates": 0,
      "heap_bytes": 2301952,
      "data_bytes": 12255232,
      "index_bytes": 458752,
      "total_bytes": 12713984,
      "oldest_analyze_seen": "2026-10-02T22:56:14.639665+00:00",
      "latest_analyze_seen": "2026-10-02T22:56:14.639665+00:00",
      "checked_at": "2026-11-02T09:45:31.365003+00:00",
      "rows_method": "statistics_estimate",
      "rows": 981,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "station_passengers": {
      "table_name": "station_passengers",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1683,
      "unknown_row_estimates": 0,
      "heap_bytes": 3227648,
      "data_bytes": 3268608,
      "index_bytes": 286720,
      "total_bytes": 3555328,
      "oldest_analyze_seen": "2026-05-21T08:21:19.539096+00:00",
      "latest_analyze_seen": "2026-05-21T08:21:19.539096+00:00",
      "checked_at": "2026-11-02T09:45:31.365006+00:00",
      "rows_method": "exact_count",
      "rows": 1683,
      "count_checked_at": "2026-11-02T09:45:37.853713+00:00",
      "exact_count_status": "success"
    },
    "subsidy_programs": {
      "table_name": "subsidy_programs",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 89802,
      "unknown_row_estimates": 0,
      "heap_bytes": 381034496,
      "data_bytes": 400449536,
      "index_bytes": 22175744,
      "total_bytes": 422625280,
      "oldest_analyze_seen": "2026-11-02T08:48:45.031876+00:00",
      "latest_analyze_seen": "2026-11-02T08:48:45.031876+00:00",
      "checked_at": "2026-11-02T09:45:31.365009+00:00",
      "rows_method": "statistics_estimate",
      "rows": 89802,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "university_startups": {
      "table_name": "university_startups",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 1455,
      "unknown_row_estimates": 0,
      "heap_bytes": 2236416,
      "data_bytes": 2277376,
      "index_bytes": 540672,
      "total_bytes": 2818048,
      "oldest_analyze_seen": "2026-10-13T05:07:13.280514+00:00",
      "latest_analyze_seen": "2026-10-13T05:07:13.280514+00:00",
      "checked_at": "2026-11-02T09:45:31.365012+00:00",
      "rows_method": "exact_count",
      "rows": 1455,
      "count_checked_at": "2026-11-02T09:45:37.923478+00:00",
      "exact_count_status": "success"
    },
    "virtual_office_locations": {
      "table_name": "virtual_office_locations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 252,
      "unknown_row_estimates": 0,
      "heap_bytes": 409600,
      "data_bytes": 450560,
      "index_bytes": 163840,
      "total_bytes": 614400,
      "oldest_analyze_seen": "2026-10-28T00:38:48.3949+00:00",
      "latest_analyze_seen": "2026-10-28T00:38:48.3949+00:00",
      "checked_at": "2026-11-02T09:45:31.365015+00:00",
      "rows_method": "exact_count",
      "rows": 252,
      "count_checked_at": "2026-11-02T09:45:38.012266+00:00",
      "exact_count_status": "success"
    },
    "virtual_organizations": {
      "table_name": "virtual_organizations",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 82250,
      "unknown_row_estimates": 0,
      "heap_bytes": 22462464,
      "data_bytes": 22503424,
      "index_bytes": 36044800,
      "total_bytes": 58548224,
      "oldest_analyze_seen": "2026-05-18T09:42:03.514979+00:00",
      "latest_analyze_seen": "2026-05-18T09:42:03.514979+00:00",
      "checked_at": "2026-11-02T09:45:31.365018+00:00",
      "rows_method": "statistics_estimate",
      "rows": 82250,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "wam_disability_rep_done": {
      "table_name": "wam_disability_rep_done",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 29417,
      "unknown_row_estimates": 0,
      "heap_bytes": 10952704,
      "data_bytes": 10993664,
      "index_bytes": 3104768,
      "total_bytes": 14098432,
      "oldest_analyze_seen": "2026-06-02T08:28:54.955648+00:00",
      "latest_analyze_seen": "2026-06-02T08:28:54.955648+00:00",
      "checked_at": "2026-11-02T09:45:31.365021+00:00",
      "rows_method": "statistics_estimate",
      "rows": 29417,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "workforce_disclosures": {
      "table_name": "workforce_disclosures",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 88386,
      "unknown_row_estimates": 0,
      "heap_bytes": 113303552,
      "data_bytes": 194494464,
      "index_bytes": 20742144,
      "total_bytes": 215236608,
      "oldest_analyze_seen": "2026-09-02T21:37:15.905913+00:00",
      "latest_analyze_seen": "2026-09-02T21:37:15.905913+00:00",
      "checked_at": "2026-11-02T09:45:31.365024+00:00",
      "rows_method": "statistics_estimate",
      "rows": 88386,
      "count_checked_at": null,
      "exact_count_status": "not_attempted_large_table"
    },
    "zoning_areas": {
      "table_name": "zoning_areas",
      "relkind": "r",
      "physical_relations": 1,
      "estimated_rows": 0,
      "unknown_row_estimates": 0,
      "heap_bytes": 0,
      "data_bytes": 8192,
      "index_bytes": 24576,
      "total_bytes": 32768,
      "oldest_analyze_seen": null,
      "latest_analyze_seen": null,
      "checked_at": "2026-11-02T09:45:31.365027+00:00",
      "rows_method": "exact_count",
      "rows": 0,
      "count_checked_at": "2026-11-02T09:45:38.093571+00:00",
      "exact_count_status": "success"
    }
  },
  "table_volume_metadata": {
    "checked_at": "2026-11-02T09:45:30.946254+00:00",
    "database": "kaisha_db",
    "table_count": 165,
    "methods": {
      "statistics_estimate": 107,
      "exact_count": 58
    },
    "scope_note": "整表当前存量；共享表和共享字段不按 source/crawler 分摊，重复出现的同一张表不得重复加总。",
    "estimate_note": "大表行数来自 PostgreSQL 统计估算，可能滞后；未执行 ANALYZE 或大表 COUNT(*)。",
    "size_note": "存储大小为数据库当前文件占用，包含旧行及空闲空间；数据空间含 TOAST，另列索引与总大小。分区表合并全部实际存储分区，不重复累加虚拟父表。",
    "count_policy": {
      "max_total_bytes": 8388608,
      "statement_timeout_ms": 2000,
      "lock_timeout_ms": 500
    }
  },
  "auxiliary_relationships": [
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 732,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "yakkyoku_registry",
          "enabled": true,
          "line": 467
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "source_url": "https://data.bodik.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "yakkyoku_registry",
          "line": 467,
          "module_chain": [
            "backend.crawlers.sources.yakkyoku_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "yakkyoku_registry",
      "crawler": "backend/crawlers/sources/yakkyoku_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 732,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "yakkyoku_registry",
          "enabled": true,
          "line": 467
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "薬局 開設許可 全国 (各自治体オープンデータ)",
      "source_url": "https://data.bodik.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN",
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "yakkyoku_registry",
          "line": 467,
          "module_chain": [
            "backend.crawlers.sources.yakkyoku_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakkyoku_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 12 10 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 10 日 12:00",
          "command": "python3 -m backend.crawlers.sources.yakkyoku_registry",
          "modules": [
            "backend.crawlers.sources.yakkyoku_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T12:00:00+09:00",
              "beijing": "2026-11-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-10T12:00:00+09:00",
              "beijing": "2026-12-10T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-10T12:00:00+09:00",
              "beijing": "2027-01-10T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 467,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/crawlers/sources/env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 118,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "env_sanpai",
          "enabled": true,
          "line": 139
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www2.sanpainet.or.jp/sanpai/search_list.php",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "env_sanpai",
          "line": 139,
          "module_chain": [
            "backend.crawlers.sources.env_sanpai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "env_sanpai",
          "scheduler": "schedule.yaml",
          "cron": "50 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:50",
          "command": "python3 -m backend.crawlers.sources.env_sanpai",
          "modules": [
            "backend.crawlers.sources.env_sanpai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:50:00+09:00",
              "beijing": "2026-11-04T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:50:00+09:00",
              "beijing": "2026-11-05T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:50:00+09:00",
              "beijing": "2026-11-06T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 139,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 47,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_xbrl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 47,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_xbrl"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "crypto_exchange_fsa",
          "enabled": true,
          "line": 545
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者一覧 (取扱資産含む)",
      "source_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
          "symbol": "PDF_URL",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "crypto_exchange_fsa",
          "line": 545,
          "module_chain": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "crypto_exchange_fsa",
      "crawler": "backend/crawlers/sources/crypto_exchange_fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "crypto_exchange_fsa",
          "enabled": true,
          "line": 545
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者一覧 (取扱資産含む)",
      "source_url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/menkyoj/kasoutuka.pdf",
          "symbol": "PDF_URL",
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "crypto_exchange_fsa",
          "line": 545,
          "module_chain": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "crypto_exchange_fsa",
          "scheduler": "schedule.yaml",
          "cron": "10 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:10",
          "command": "python3 -m backend.crawlers.sources.crypto_exchange_fsa",
          "modules": [
            "backend.crawlers.sources.crypto_exchange_fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 5,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:10:00+09:00",
              "beijing": "2026-12-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:10:00+09:00",
              "beijing": "2027-01-05T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 545,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_business_purpose.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 258,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_business_purpose",
          "enabled": true,
          "line": 1177
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 58,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sec_20f",
          "enabled": true,
          "line": 569
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "source_url": "https://www.sec.gov/",
      "crawler_url_candidates": [
        {
          "url": "https://efts.sec.gov/LATEST/search-index",
          "symbol": "EFTS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://data.sec.gov/submissions/CIK{cik10}.json",
          "symbol": "SUBMISSIONS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sec_20f",
          "line": 569,
          "module_chain": [
            "backend.crawlers.sources.sec_20f"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sec_20f",
      "crawler": "backend/crawlers/sources/sec_20f.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 58,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sec_20f",
          "enabled": true,
          "line": 569
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "SEC EDGAR 米国上場日本企業 (Form 20-F)",
      "source_url": "https://www.sec.gov/",
      "crawler_url_candidates": [
        {
          "url": "https://efts.sec.gov/LATEST/search-index",
          "symbol": "EFTS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://data.sec.gov/submissions/CIK{cik10}.json",
          "symbol": "SUBMISSIONS_URL",
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sec_20f",
          "line": 569,
          "module_chain": [
            "backend.crawlers.sources.sec_20f"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sec_20f",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.sec_20f --max-pages 10",
          "modules": [
            "backend.crawlers.sources.sec_20f"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 569,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 272,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "school_institution",
          "enabled": true,
          "line": 606
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "source_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
          "symbol": "BASE_PAGE",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "school_institution",
          "line": 606,
          "module_chain": [
            "backend.crawlers.sources.school_institution"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "twice_yearly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "school_institution",
      "crawler": "backend/crawlers/sources/school_institution.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 272,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "school_institution",
          "enabled": true,
          "line": 606
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国)",
      "source_url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mext.go.jp/b_menu/toukei/mext_01087.html",
          "symbol": "BASE_PAGE",
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "school_institution",
          "line": 606,
          "module_chain": [
            "backend.crawlers.sources.school_institution"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "school_institution",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 5,12 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "twice_yearly",
          "label": "每年 5、12 月 10 日 06:00",
          "command": "python3 -m backend.crawlers.sources.school_institution",
          "modules": [
            "backend.crawlers.sources.school_institution"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-10T06:00:00+09:00",
              "beijing": "2026-12-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-05-10T06:00:00+09:00",
              "beijing": "2027-05-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-12-10T06:00:00+09:00",
              "beijing": "2027-12-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 606,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "twice_yearly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 395,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 499,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wikidata_houjin",
          "enabled": true,
          "line": 527
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "Wikidata 法人番号 LOD",
      "source_url": "https://query.wikidata.org/sparql",
      "crawler_url_candidates": [
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "SPARQL_URL",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "sparql_endpoint",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wikidata_houjin",
          "line": 527,
          "module_chain": [
            "backend.crawlers.sources.wikidata_houjin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "wikidata_houjin",
      "crawler": "backend/crawlers/sources/wikidata_houjin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 395,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 499,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wikidata_houjin",
          "enabled": true,
          "line": 527
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "Wikidata 法人番号 LOD",
      "source_url": "https://query.wikidata.org/sparql",
      "crawler_url_candidates": [
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "SPARQL_URL",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://query.wikidata.org/sparql",
          "symbol": "sparql_endpoint",
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wikidata_houjin",
          "line": 527,
          "module_chain": [
            "backend.crawlers.sources.wikidata_houjin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "wikidata_houjin",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 10:00",
          "command": "python3 -m backend.crawlers.sources.wikidata_houjin --daily-shard",
          "modules": [
            "backend.crawlers.sources.wikidata_houjin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T10:00:00+09:00",
              "beijing": "2026-11-04T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T10:00:00+09:00",
              "beijing": "2026-11-05T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T10:00:00+09:00",
              "beijing": "2026-11-06T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 527,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "temp_staffing_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 107,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "労働者派遣事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102010.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "job_placement_registry",
      "crawler": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 115,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "temp_staffing_and_job_placement",
          "enabled": true,
          "line": 950
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "有料職業紹介事業所登録",
      "source_url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB102030.do",
      "crawler_url_candidates": [
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 70,
          "origin": "online"
        },
        {
          "url": "https://jinzai.hellowork.mhlw.go.jp/JinzaiWeb/GICB101010.do",
          "symbol": "TOP_URL",
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 71,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "temp_staffing_and_job_placement",
          "line": 950,
          "module_chain": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "temp_staffing_and_job_placement",
          "scheduler": "schedule.yaml",
          "cron": "0 16 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 16:00",
          "command": "python3 -m backend.crawlers.sources.temp_staffing_and_job_placement",
          "modules": [
            "backend.crawlers.sources.temp_staffing_and_job_placement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T16:00:00+09:00",
              "beijing": "2026-11-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T16:00:00+09:00",
              "beijing": "2026-12-07T15:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T16:00:00+09:00",
              "beijing": "2027-01-07T15:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 950,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 43,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "crypto_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 43,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暗号資産交換業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 48,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "登録貸金業者検索",
      "source_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "loan_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 48,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "登録貸金業者検索",
      "source_url": "https://www.fsa.go.jp/ordinary/kensaku/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 53,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融商品取引業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fsa_registry",
      "crawler": "backend/crawlers/sources/fsa_registries.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 53,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融商品取引業者登録一覧",
      "source_url": "https://www.fsa.go.jp/menkyo/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "travel_agencies",
          "enabled": true,
          "line": 1018
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "source_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/index.html",
          "symbol": "KANKOCHO_PAGE",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 77,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "travel_agencies",
          "line": 1018,
          "module_chain": [
            "backend.crawlers.sources.travel_agencies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "travel_agencies",
      "crawler": "backend/crawlers/sources/travel_agencies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "travel_agencies",
          "enabled": true,
          "line": 1018
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 (観光庁長官登録1種 + 都道府県知事登録)",
      "source_url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/index.html",
          "symbol": "KANKOCHO_PAGE",
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 77,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "travel_agencies",
          "line": 1018,
          "module_chain": [
            "backend.crawlers.sources.travel_agencies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "travel_agencies",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:00",
          "command": "python3 -m backend.crawlers.sources.travel_agencies --full",
          "modules": [
            "backend.crawlers.sources.travel_agencies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:00:00+09:00",
              "beijing": "2026-11-04T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:00:00+09:00",
              "beijing": "2026-11-11T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:00:00+09:00",
              "beijing": "2026-11-18T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1018,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 299,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 561,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 602,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 663,
          "kind": "source_code_argument",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 744,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kanpo.go.jp/",
          "symbol": "OFFICIAL_BASE",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "govbook_kanpo_index",
      "crawler": "backend/crawlers/sources/kanpo_official.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 562,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 673,
          "kind": "source_code_argument",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "全国官報販売協同組合 官報目次検索",
      "source_url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
      "crawler_url_candidates": [
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "GOV_BOOK_URL",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.gov-book.or.jp/asp/Kanpo/KanpoList/",
          "symbol": "post_url",
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 335,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_official",
          "line": 252,
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_official",
          "scheduler": "schedule.yaml",
          "cron": "5 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:05",
          "command": "python3 -m backend.scripts.run_kanpo_insolvency_recent --lookback-days 21 --max-dates 12 --rps 1",
          "modules": [
            "backend.scripts.run_kanpo_insolvency_recent"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:05:00+09:00",
              "beijing": "2026-11-04T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:05:00+09:00",
              "beijing": "2026-11-05T08:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:05:00+09:00",
              "beijing": "2026-11-06T08:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 252,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_kanpo_insolvency_recent",
            "backend.crawlers.sources.kanpo_official"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 513,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shokuhin_eisei",
          "enabled": true,
          "line": 371
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "食品衛生申請等システム (食品営業許可・届出)",
      "source_url": "https://i2fas.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN_SEARCH",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shokuhin_eisei",
          "line": 371,
          "module_chain": [
            "backend.crawlers.sources.shokuhin_eisei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "shokuhin_eisei",
      "crawler": "backend/crawlers/sources/shokuhin_eisei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 513,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shokuhin_eisei",
          "enabled": true,
          "line": 371
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "食品衛生申請等システム (食品営業許可・届出)",
      "source_url": "https://i2fas.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/api/3/action/package_search",
          "symbol": "BODIK_CKAN_SEARCH",
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shokuhin_eisei",
          "line": 371,
          "module_chain": [
            "backend.crawlers.sources.shokuhin_eisei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shokuhin_eisei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.shokuhin_eisei",
          "modules": [
            "backend.crawlers.sources.shokuhin_eisei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T05:00:00+09:00",
              "beijing": "2026-12-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T05:00:00+09:00",
              "beijing": "2027-02-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 371,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 56,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "daigaku_hatsu_vc",
          "enabled": true,
          "line": 500
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "大学発ベンチャーデータベース",
      "source_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 54,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
          "symbol": "HUB_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 55,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "daigaku_hatsu_vc",
          "line": 500,
          "module_chain": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "daigaku_hatsu_vc",
      "crawler": "backend/crawlers/sources/daigaku_hatsu_vc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 56,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "daigaku_hatsu_vc",
          "enabled": true,
          "line": 500
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "大学発ベンチャーデータベース",
      "source_url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 54,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/univ-startupsdb.html",
          "symbol": "HUB_URL",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 55,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/innovation_corp/excel/Univ-venture_db_data.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "daigaku_hatsu_vc",
          "line": 500,
          "module_chain": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "daigaku_hatsu_vc",
          "scheduler": "schedule.yaml",
          "cron": "0 14 13 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 13 日 14:00",
          "command": "python3 -m backend.crawlers.sources.daigaku_hatsu_vc",
          "modules": [
            "backend.crawlers.sources.daigaku_hatsu_vc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-13T14:00:00+09:00",
              "beijing": "2026-11-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-13T14:00:00+09:00",
              "beijing": "2026-12-13T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-13T14:00:00+09:00",
              "beijing": "2027-01-13T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 500,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "real_estate_appraisers",
      "crawler": "backend/crawlers/sources/real_estate_appraisers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 69,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "real_estate_appraisers",
          "enabled": true,
          "line": 1034
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産鑑定業者名簿 (国交省)",
      "source_url": "https://www.mlit.go.jp/totikensangyo/totikensangyo_tk4_000018.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "real_estate_appraisers",
          "line": 1034,
          "module_chain": [
            "backend.crawlers.sources.real_estate_appraisers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "real_estate_appraisers",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.crawlers.sources.real_estate_appraisers",
          "modules": [
            "backend.crawlers.sources.real_estate_appraisers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1034,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 582,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_xbrl",
          "enabled": true,
          "line": 66
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 582,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_xbrl",
          "enabled": true,
          "line": 66
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 92,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "youth_yell",
          "enabled": true,
          "line": 551
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        9,
        10
      ],
      "source_name": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "source_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/ninteilist.action",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 405,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "youth_yell",
          "line": 551,
          "module_chain": [
            "backend.crawlers.sources.youth_yell"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "youth_yell",
      "crawler": "backend/crawlers/sources/youth_yell.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 92,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "youth_yell",
          "enabled": true,
          "line": 551
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        9,
        10
      ],
      "source_name": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト)",
      "source_url": "https://wakamono-koyou-sokushin.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/ninteilist.action",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://wakamono-koyou-sokushin.mhlw.go.jp/search/service/portalkigyodetail.action",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 405,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "youth_yell",
          "line": 551,
          "module_chain": [
            "backend.crawlers.sources.youth_yell"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "youth_yell",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.youth_yell --full",
          "modules": [
            "backend.crawlers.sources.youth_yell"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 551,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 225,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 230,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "dx_nintei",
          "enabled": true,
          "line": 533
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "DX認定事業者 (IPA / 経産省)",
      "source_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "crawler_url_candidates": [
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "CSV_URL",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/details",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 154,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 251,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "dx_nintei",
          "line": 533,
          "module_chain": [
            "backend.crawlers.sources.dx_nintei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "dx_nintei",
      "crawler": "backend/crawlers/sources/dx_nintei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 225,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 230,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "dx_nintei",
          "enabled": true,
          "line": 533
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "DX認定事業者 (IPA / 経産省)",
      "source_url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/search",
      "crawler_url_candidates": [
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "CSV_URL",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/p/dxcp/details",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 154,
          "origin": "online"
        },
        {
          "url": "https://disclosure.dx-portal.ipa.go.jp/download/AllData.csv",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 251,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "dx_nintei",
          "line": 533,
          "module_chain": [
            "backend.crawlers.sources.dx_nintei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "dx_nintei",
          "scheduler": "schedule.yaml",
          "cron": "30 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:30",
          "command": "python3 -m backend.crawlers.sources.dx_nintei --rps 1.0",
          "modules": [
            "backend.crawlers.sources.dx_nintei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:30:00+09:00",
              "beijing": "2026-12-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:30:00+09:00",
              "beijing": "2027-01-05T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 533,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 156,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_filings",
          "enabled": true,
          "line": 60
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "enabled": true,
          "line": 324
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2/documents.json",
          "symbol": "API",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_filings",
          "line": 60,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "line": 324,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "edinet",
      "crawler": "backend/crawlers/sources/edinet_filings.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 156,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_filings",
          "enabled": true,
          "line": 60
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "enabled": true,
          "line": 324
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2/documents.json",
          "symbol": "API",
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_filings",
          "line": 60,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_xbrl",
          "line": 66,
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "line": 324,
          "module_chain": [
            "backend.crawlers.sources.edinet_filings"
          ]
        },
        {
          "task": "edinet_business_purpose",
          "line": 1177,
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_filings",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:10",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 2",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:10:00+09:00",
              "beijing": "2026-11-04T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:10:00+09:00",
              "beijing": "2026-11-05T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:10:00+09:00",
              "beijing": "2026-11-06T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 60,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 6",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周日 06:00",
          "command": "python3 -m backend.crawlers.sources.edinet_filings --limit-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_filings"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:00:00+09:00",
              "beijing": "2026-11-08T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-15T06:00:00+09:00",
              "beijing": "2026-11-15T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-22T06:00:00+09:00",
              "beijing": "2026-11-22T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 324,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "edinet_xbrl",
          "scheduler": "schedule.yaml",
          "cron": "30 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30",
          "command": "python3 -m backend.crawlers.sources.edinet",
          "modules": [
            "backend.crawlers.sources.edinet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+09:00",
              "beijing": "2026-11-04T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+09:00",
              "beijing": "2026-11-05T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 66,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "edinet_business_purpose",
          "scheduler": "schedule.yaml",
          "cron": "20 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:20",
          "command": "python3 -m backend.crawlers.sources.edinet_business_purpose --recent-days 14",
          "modules": [
            "backend.crawlers.sources.edinet_business_purpose"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:20:00+09:00",
              "beijing": "2026-11-04T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:20:00+09:00",
              "beijing": "2026-11-05T07:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:20:00+09:00",
              "beijing": "2026-11-06T07:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1177,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.crawlers.sources.edinet_business_purpose",
            "backend.crawlers.sources.edinet",
            "backend.crawlers.sources.edinet_filings"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 355,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 371,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shougai_fukushi",
          "enabled": true,
          "line": 563
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "source_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 82,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 83,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/files/pcpub/top/sfkopendata/{period}/sfkopendata_{period}_{svc}.zip",
          "symbol": "ZIP_URL_TMPL",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 84,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shougai_fukushi",
          "line": 563,
          "module_chain": [
            "backend.crawlers.sources.shougai_fukushi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "semiannual"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "shougai_fukushi",
      "crawler": "backend/crawlers/sources/shougai_fukushi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 355,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 371,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shougai_fukushi",
          "enabled": true,
          "line": 563
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "障害福祉サービス等情報公表システム オープンデータ (WAM)",
      "source_url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 82,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/wamnet/pcpub/top/sfkopendata/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 83,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/content/files/pcpub/top/sfkopendata/{period}/sfkopendata_{period}_{svc}.zip",
          "symbol": "ZIP_URL_TMPL",
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 84,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shougai_fukushi",
          "line": 563,
          "module_chain": [
            "backend.crawlers.sources.shougai_fukushi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shougai_fukushi",
          "scheduler": "schedule.yaml",
          "cron": "0 6 20 4,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "semiannual",
          "label": "每年 4、10 月 20 日 06:00",
          "command": "python3 -m backend.crawlers.sources.shougai_fukushi --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shougai_fukushi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-04-20T06:00:00+09:00",
              "beijing": "2027-04-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-10-20T06:00:00+09:00",
              "beijing": "2027-10-20T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2028-04-20T06:00:00+09:00",
              "beijing": "2028-04-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 563,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "semiannual"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 283,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 296,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kenko_keiei",
          "enabled": true,
          "line": 482
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営優良法人認定 (経産省/日本健康会議)",
      "source_url": "https://kenko-keiei.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kenko-keiei.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://kenko-keiei.jp/houjin_list/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kenko_keiei",
          "line": 482,
          "module_chain": [
            "backend.crawlers.sources.kenko_keiei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "kenko_keiei",
      "crawler": "backend/crawlers/sources/kenko_keiei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 283,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 296,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kenko_keiei",
          "enabled": true,
          "line": 482
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営優良法人認定 (経産省/日本健康会議)",
      "source_url": "https://kenko-keiei.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kenko-keiei.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://kenko-keiei.jp/houjin_list/",
          "symbol": "LIST_HUB",
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kenko_keiei",
          "line": 482,
          "module_chain": [
            "backend.crawlers.sources.kenko_keiei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kenko_keiei",
          "scheduler": "schedule.yaml",
          "cron": "0 13 11 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 11 日 13:00",
          "command": "python3 -m backend.crawlers.sources.kenko_keiei",
          "modules": [
            "backend.crawlers.sources.kenko_keiei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-11T13:00:00+09:00",
              "beijing": "2026-11-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-11T13:00:00+09:00",
              "beijing": "2026-12-11T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-11T13:00:00+09:00",
              "beijing": "2027-01-11T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 482,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 82,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, name_en, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, '資源エネルギー庁 発電事業者一覧', 'ANRE Electricity Generators',\n                    'license', '資源エネルギー庁', %s, 'public_open', 'P1', true)\n            ON CONFLICT (code) DO UPDATE SET updated_at=now() RETURNING id\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "enecho_power_generators",
      "crawler": "backend/crawlers/sources/enecho_power_generators.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 20,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_power_generators",
          "enabled": true,
          "line": 746
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "資源エネルギー庁 発電事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electricity_measures/004/list/",
          "symbol": "URL",
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 21,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_power_generators",
          "line": 746,
          "module_chain": [
            "backend.crawlers.sources.enecho_power_generators"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "enecho_power_generators",
          "scheduler": "schedule.yaml",
          "cron": "10 5 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 05:10",
          "command": "python3 -m backend.crawlers.sources.enecho_power_generators",
          "modules": [
            "backend.crawlers.sources.enecho_power_generators"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T05:10:00+09:00",
              "beijing": "2026-11-10T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T05:10:00+09:00",
              "beijing": "2026-11-17T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T05:10:00+09:00",
              "beijing": "2026-11-24T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 746,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 176,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jclp",
          "enabled": true,
          "line": 494
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "source_url": "https://japan-clp.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://japan-clp.jp/about/organization",
          "symbol": "URL",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 57,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jclp",
          "line": 494,
          "module_chain": [
            "backend.crawlers.sources.jclp"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jclp",
      "crawler": "backend/crawlers/sources/jclp.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 172,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 176,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jclp",
          "enabled": true,
          "line": 494
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本気候リーダーズ・パートナーシップ (JCLP)",
      "source_url": "https://japan-clp.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://japan-clp.jp/about/organization",
          "symbol": "URL",
          "file": "backend/crawlers/sources/jclp.py",
          "line": 57,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jclp",
          "line": 494,
          "module_chain": [
            "backend.crawlers.sources.jclp"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jclp",
          "scheduler": "schedule.yaml",
          "cron": "30 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:30",
          "command": "python3 -m backend.crawlers.sources.jclp",
          "modules": [
            "backend.crawlers.sources.jclp"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:30:00+09:00",
              "beijing": "2026-11-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:30:00+09:00",
              "beijing": "2026-12-12T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:30:00+09:00",
              "beijing": "2027-01-12T12:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 494,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 351,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 392,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "medical_facilities",
          "enabled": true,
          "line": 461
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "医療機能情報提供制度 全国オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CONTENT_BASE",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "medical_facilities",
          "line": 461,
          "module_chain": [
            "backend.crawlers.sources.medical_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "medical_facilities",
      "crawler": "backend/crawlers/sources/medical_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 351,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 392,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "medical_facilities",
          "enabled": true,
          "line": 461
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "医療機能情報提供制度 全国オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/kenkou_iryou/iryou/newpage_43373.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CONTENT_BASE",
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "medical_facilities",
          "line": 461,
          "module_chain": [
            "backend.crawlers.sources.medical_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "medical_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.crawlers.sources.medical_facilities",
          "modules": [
            "backend.crawlers.sources.medical_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 461,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1,
        2,
        6,
        10,
        11
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo_full.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 600,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_ip",
          "enabled": true,
          "line": 1189
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        1,
        2,
        6,
        10,
        11
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 52,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_ip",
          "line": 1189,
          "module_chain": [
            "backend.crawlers.sources.gbizinfo_full"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_ip",
          "scheduler": "schedule.yaml",
          "cron": "0 14 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 14:00",
          "command": "python3 -m backend.crawlers.sources.gbizinfo_full --ip-only --daily-shard --rps 1",
          "modules": [
            "backend.crawlers.sources.gbizinfo_full"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T14:00:00+09:00",
              "beijing": "2026-11-04T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T14:00:00+09:00",
              "beijing": "2026-11-05T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T14:00:00+09:00",
              "beijing": "2026-11-06T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1189,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "bid_notice_crawl_segments",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "bid_notice_crawl_segments",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 373,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO bid_notice_crawl_segments (\n            source_id, segment_key, lg_code, category, procedure_type,\n            period_start, period_end, status, search_hits, records_returned,\n            last_run_at, error_message, metrics, updated_at\n        ) VALUES (\n            %s, %s, %s, %s, %s,\n            %s, %s, %s, %s, %s,\n            now(), %s, %s::jsonb, now()\n        )\n        ON CONFLICT (source_id, segment_key) DO UPDATE SET\n            status = EXCLUDED.status,\n            search_hits = EXCLUDED.search_hits,\n            records_returned = EXCLUDED.records_returned,\n            last_run_at = EXCLUDED.last_run_at,\n            error_message = EXCLUDED.error_message,\n            metrics = bid_notice_crawl_segments.metrics || EXCLUDED.metrics,\n            updated_at = now()\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "采集分段／断点"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "kkj_bid_notices",
      "crawler": "backend/crawlers/sources/kkj_bid_notices.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kkj_bid_notices",
          "enabled": true,
          "line": 658
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "官公需情報ポータルサイト検索API 入札公告",
      "source_url": "https://www.kkj.go.jp/api/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 57,
          "origin": "online"
        },
        {
          "url": "https://www.kkj.go.jp/api/",
          "symbol": "url",
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 695,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kkj_bid_notices",
          "line": 658,
          "module_chain": [
            "backend.crawlers.sources.kkj_bid_notices"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kkj_bid_notices",
          "scheduler": "schedule.yaml",
          "cron": "15 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:15",
          "command": "python3 -m backend.crawlers.sources.kkj_bid_notices --lookback-days 3 --granularity day --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.kkj_bid_notices"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:15:00+09:00",
              "beijing": "2026-11-04T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:15:00+09:00",
              "beijing": "2026-11-05T01:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:15:00+09:00",
              "beijing": "2026-11-06T01:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 658,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shihoshoshi",
          "enabled": true,
          "line": 437
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "司法書士検索",
      "source_url": "https://www.shiho-shoshi.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shiho-shoshi.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 97,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 98,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 375,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shihoshoshi",
          "line": 437,
          "module_chain": [
            "backend.crawlers.sources.shihoshoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "shihoshoshi",
      "crawler": "backend/crawlers/sources/shihoshoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "shihoshoshi",
          "enabled": true,
          "line": 437
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "司法書士検索",
      "source_url": "https://www.shiho-shoshi.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shiho-shoshi.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 97,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 98,
          "origin": "online"
        },
        {
          "url": "https://www.shiho-shoshi.or.jp/search/member.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 375,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "shihoshoshi",
          "line": 437,
          "module_chain": [
            "backend.crawlers.sources.shihoshoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shihoshoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 11:00",
          "command": "python3 -m backend.crawlers.sources.shihoshoshi --full --rps 0.5",
          "modules": [
            "backend.crawlers.sources.shihoshoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T11:00:00+09:00",
              "beijing": "2026-11-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T11:00:00+09:00",
              "beijing": "2026-12-05T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T11:00:00+09:00",
              "beijing": "2027-01-05T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 437,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "hojyokin_portal",
      "crawler": "backend/crawlers/sources/hojyokin_portal.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "enabled": false,
          "line": 689
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "enabled": false,
          "line": 696
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "enabled": true,
          "line": 703
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "enabled": true,
          "line": 709
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "補助金ポータル 補助金・助成金・支援金",
      "source_url": "https://hojyokin-portal.jp/subsidies/list",
      "crawler_url_candidates": [
        {
          "url": "https://hojyokin-portal.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://hojyokin-portal.jp/subsidies/list",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "line": 703,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "line": 709,
          "module_chain": [
            "backend.crawlers.sources.hojyokin_portal"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hojyokin_portal_support_programs_recent",
          "scheduler": "schedule.yaml",
          "cron": "35 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 03:35",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --max-pages-per-pref 20 --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 689,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_full",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "weekly",
          "label": "每周一 03:40",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --sleep 1.0 --list-workers 1 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 696,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "scheduler": "schedule.yaml",
          "cron": "10 4 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 04:10",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --include-ended --list-snapshot-only --sleep 1.0 --list-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 480,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T04:10:00+09:00",
              "beijing": "2026-11-10T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T04:10:00+09:00",
              "beijing": "2026-11-17T03:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T04:10:00+09:00",
              "beijing": "2026-11-24T03:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 703,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "scheduler": "schedule.yaml",
          "cron": "55 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:55",
          "command": "python3 -m backend.crawlers.sources.hojyokin_portal --snapshot-detail-limit 500 --sleep 1.0 --detail-workers 1",
          "modules": [
            "backend.crawlers.sources.hojyokin_portal"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:55:00+09:00",
              "beijing": "2026-11-04T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:55:00+09:00",
              "beijing": "2026-11-05T03:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:55:00+09:00",
              "beijing": "2026-11-06T03:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 709,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tcfd_supporters",
          "enabled": true,
          "line": 488
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TCFD賛同企業・機関 (経産省)",
      "source_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "URL",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 349,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tcfd_supporters",
          "line": 488,
          "module_chain": [
            "backend.crawlers.sources.tcfd_supporters"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "tcfd_supporters",
      "crawler": "backend/crawlers/sources/tcfd_supporters.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 102,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tcfd_supporters",
          "enabled": true,
          "line": 488
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TCFD賛同企業・機関 (経産省)",
      "source_url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "URL",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/energy_environment/global_warming/tcfd_supporters.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 349,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tcfd_supporters",
          "line": 488,
          "module_chain": [
            "backend.crawlers.sources.tcfd_supporters"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tcfd_supporters",
          "scheduler": "schedule.yaml",
          "cron": "0 13 12 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 12 日 13:00",
          "command": "python3 -m backend.crawlers.sources.tcfd_supporters",
          "modules": [
            "backend.crawlers.sources.tcfd_supporters"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-12T13:00:00+09:00",
              "beijing": "2026-11-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-12T13:00:00+09:00",
              "beijing": "2026-12-12T12:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-12T13:00:00+09:00",
              "beijing": "2027-01-12T12:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 488,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 624,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seiji_shikin",
          "enabled": true,
          "line": 521
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 84,
          "origin": "online"
        },
        {
          "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 85,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seiji_shikin",
          "line": 521,
          "module_chain": [
            "backend.crawlers.sources.seiji_shikin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 624,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seiji_shikin",
          "enabled": true,
          "line": 521
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 84,
          "origin": "online"
        },
        {
          "url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 85,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seiji_shikin",
          "line": 521,
          "module_chain": [
            "backend.crawlers.sources.seiji_shikin"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seiji_shikin",
          "scheduler": "schedule.yaml",
          "cron": "30 4 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 04:30",
          "command": "python3 -m backend.crawlers.sources.seiji_shikin --all",
          "modules": [
            "backend.crawlers.sources.seiji_shikin"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T04:30:00+09:00",
              "beijing": "2026-11-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T04:30:00+09:00",
              "beijing": "2026-12-06T03:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T04:30:00+09:00",
              "beijing": "2027-01-06T03:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 521,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/crawlers/sources/courts_hanrei.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei",
          "enabled": true,
          "line": 73
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 224,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n            ON CONFLICT (code) DO NOTHING\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "src_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 285,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 192,
          "origin": "online"
        },
        {
          "url": "https://www.courts.go.jp/hanrei/{dynamic}/{dynamic}/index.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei",
          "line": 73,
          "module_chain": [
            "backend.crawlers.sources.courts_hanrei"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "courts_hanrei",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:00",
          "command": "python3 -m backend.crawlers.sources.courts_hanrei --pages-max 50",
          "modules": [
            "backend.crawlers.sources.courts_hanrei"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:00:00+09:00",
              "beijing": "2026-11-05T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:00:00+09:00",
              "beijing": "2026-11-06T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 73,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 328,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nite_jiko",
          "enabled": true,
          "line": 154
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NITE 製品事故情報",
      "source_url": "https://www.nite.go.jp/jiko/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nite.go.jp/jiko/jikojohou/information/index.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.nite.go.jp",
          "symbol": "DATA_BASE",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 69,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nite_jiko",
          "line": 154,
          "module_chain": [
            "backend.crawlers.sources.nite_jiko"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "nite_jiko",
      "crawler": "backend/crawlers/sources/nite_jiko.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 328,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nite_jiko",
          "enabled": true,
          "line": 154
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NITE 製品事故情報",
      "source_url": "https://www.nite.go.jp/jiko/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nite.go.jp/jiko/jikojohou/information/index.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.nite.go.jp",
          "symbol": "DATA_BASE",
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 69,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nite_jiko",
          "line": 154,
          "module_chain": [
            "backend.crawlers.sources.nite_jiko"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nite_jiko",
          "scheduler": "schedule.yaml",
          "cron": "10 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:10",
          "command": "python3 -m backend.crawlers.sources.nite_jiko",
          "modules": [
            "backend.crawlers.sources.nite_jiko"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:10:00+09:00",
              "beijing": "2026-11-04T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:10:00+09:00",
              "beijing": "2026-11-05T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:10:00+09:00",
              "beijing": "2026-11-06T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 154,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            ) VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                '{\"strategy\":\"incremental\",\"scope\":\"latest_100_bankruptcy_flash\",\"country\":\"Japan\"}'::jsonb,\n                '{\"tos_checked\":true,\"public_page\":true,\"notes\":\"Public TDB bankruptcy flash report search loader; stores compact factual signals and source URLs.\"}'::jsonb\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_active=EXCLUDED.is_active,\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "tdb_bankruptcy_flash",
      "crawler": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdb_bankruptcy_flash",
          "enabled": true,
          "line": 216
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "帝国データバンク 倒産速報",
      "source_url": "https://www.tdb.co.jp/report/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.tdb.co.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.tdb.co.jp/report/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdb_bankruptcy_flash",
          "line": 216,
          "module_chain": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdb_bankruptcy_flash",
          "scheduler": "schedule.yaml",
          "cron": "25 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:25",
          "command": "python3 -m backend.crawlers.sources.tdb_bankruptcy_flash --page 10 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.tdb_bankruptcy_flash"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:25:00+09:00",
              "beijing": "2026-11-04T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:25:00+09:00",
              "beijing": "2026-11-05T07:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:25:00+09:00",
              "beijing": "2026-11-06T07:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 216,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet_officer_changes",
      "crawler": "backend/crawlers/sources/edinet_officer_changes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 633,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 804,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officer_changes",
          "enabled": true,
          "line": 1010
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員の異動 (臨時報告書 doc_type 180)",
      "source_url": "https://api.edinet-fsa.go.jp/api/v2",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 107,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officer_changes",
          "line": 1010,
          "module_chain": [
            "backend.crawlers.sources.edinet_officer_changes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officer_changes",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.edinet_officer_changes",
          "modules": [
            "backend.crawlers.sources.edinet_officer_changes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1010,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/npo.py",
          "line": 77,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 71,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 127,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "geps",
          "enabled": true,
          "line": 648
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/geps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "url",
          "file": "backend/crawlers/sources/geps.py",
          "line": 82,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "geps",
          "line": 648,
          "module_chain": [
            "backend.crawlers.sources.geps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "geps",
      "crawler": "backend/crawlers/sources/geps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 127,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "geps",
          "enabled": true,
          "line": 648
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/geps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "url",
          "file": "backend/crawlers/sources/geps.py",
          "line": 82,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "geps",
          "line": 648,
          "module_chain": [
            "backend.crawlers.sources.geps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "geps",
          "scheduler": "schedule.yaml",
          "cron": "0 5 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 05:00",
          "command": "python3 -m backend.crawlers.sources.geps --years 2025 2026",
          "modules": [
            "backend.crawlers.sources.geps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T05:00:00+09:00",
              "beijing": "2026-11-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T05:00:00+09:00",
              "beijing": "2026-12-07T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T05:00:00+09:00",
              "beijing": "2027-01-07T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 648,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "seiji_shikin",
      "crawler": "backend/crawlers/sources/seiji_shikin_donors.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 329,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "政治資金収支報告書",
      "source_url": "https://www.soumu.go.jp/senkyo/seiji_s/seijishikin/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 221,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "niigata_bengo",
      "crawler": "backend/crawlers/sources/niigata_bengo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 211,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "niigata_bengo",
          "enabled": true,
          "line": 978
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "新潟県弁護士会 弁護士検索",
      "source_url": "https://www.niigata-bengo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.niigata-bengo.or.jp/lawyer/search.html/field/lawyer_kana_initial/lk/{kana}/",
          "symbol": "KANA_URL_TMPL",
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "niigata_bengo",
          "line": 978,
          "module_chain": [
            "backend.crawlers.sources.niigata_bengo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "niigata_bengo",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 09:00",
          "command": "python3 -m backend.crawlers.sources.niigata_bengo",
          "modules": [
            "backend.crawlers.sources.niigata_bengo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T09:00:00+09:00",
              "beijing": "2026-11-09T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T09:00:00+09:00",
              "beijing": "2026-11-16T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T09:00:00+09:00",
              "beijing": "2026-11-23T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 978,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 223,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 265,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "prtimes",
          "enabled": true,
          "line": 38
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "PR TIMES プレスリリース",
      "source_url": "https://prtimes.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://prtimes.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://prtimes.jp/sitemap-news.xml",
          "symbol": "SITEMAP_NEWS",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "prtimes",
          "line": 38,
          "module_chain": [
            "backend.crawlers.sources.prtimes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "prtimes",
      "crawler": "backend/crawlers/sources/prtimes.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 223,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 265,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "prtimes",
          "enabled": true,
          "line": 38
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "PR TIMES プレスリリース",
      "source_url": "https://prtimes.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://prtimes.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://prtimes.jp/sitemap-news.xml",
          "symbol": "SITEMAP_NEWS",
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "prtimes",
          "line": 38,
          "module_chain": [
            "backend.crawlers.sources.prtimes"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prtimes",
          "scheduler": "schedule.yaml",
          "cron": "15 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 15 分",
          "command": "python3 -m backend.crawlers.sources.prtimes --rps 0.5",
          "modules": [
            "backend.crawlers.sources.prtimes"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:15:00+09:00",
              "beijing": "2026-11-03T17:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:15:00+09:00",
              "beijing": "2026-11-03T18:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:15:00+09:00",
              "beijing": "2026-11-03T19:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 38,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 445,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "security_companies",
          "enabled": true,
          "line": 1026
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "source_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "security_companies",
          "line": 1026,
          "module_chain": [
            "backend.crawlers.sources.security_companies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "security_companies",
      "crawler": "backend/crawlers/sources/security_companies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 445,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "security_companies",
          "enabled": true,
          "line": 1026
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警備業認定業者一覧 (都道府県警察 警備業法第4条)",
      "source_url": "https://www.pref.hiroshima.lg.jp/site/police/keibigyou.html",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "security_companies",
          "line": 1026,
          "module_chain": [
            "backend.crawlers.sources.security_companies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "security_companies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 08:30",
          "command": "python3 -m backend.crawlers.sources.security_companies",
          "modules": [
            "backend.crawlers.sources.security_companies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:30:00+09:00",
              "beijing": "2026-11-04T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T08:30:00+09:00",
              "beijing": "2026-11-11T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T08:30:00+09:00",
              "beijing": "2026-11-18T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1026,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 363,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 428,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "partnership_declaration",
          "enabled": true,
          "line": 539
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "パートナーシップ構築宣言",
      "source_url": "https://www.biz-partnership.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/declaration/",
          "symbol": "PDF_BASE",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 111,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 499,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "partnership_declaration",
          "line": 539,
          "module_chain": [
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps",
          "line": 722,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "line": 728,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "partnership_declaration",
      "crawler": "backend/crawlers/sources/partnership_declaration.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 363,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 428,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "partnership_declaration",
          "enabled": true,
          "line": 539
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "パートナーシップ構築宣言",
      "source_url": "https://www.biz-partnership.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/declaration/",
          "symbol": "PDF_BASE",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 111,
          "origin": "online"
        },
        {
          "url": "https://www.biz-partnership.jp/list/api.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 499,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "partnership_declaration",
          "line": 539,
          "module_chain": [
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps",
          "line": 722,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "line": 728,
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "partnership_declaration",
          "scheduler": "schedule.yaml",
          "cron": "45 4 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 04:45",
          "command": "python3 -m backend.crawlers.sources.partnership_declaration --rps 2.0",
          "modules": [
            "backend.crawlers.sources.partnership_declaration"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T04:45:00+09:00",
              "beijing": "2026-11-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T04:45:00+09:00",
              "beijing": "2026-12-05T03:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T04:45:00+09:00",
              "beijing": "2027-01-05T03:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 539,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.backfill_partnership_declaration_reps",
            "backend.crawlers.sources.partnership_declaration"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "takken_registry",
      "crawler": "backend/crawlers/sources/takken_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "takken_registry",
          "enabled": true,
          "line": 449
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "建設業者・宅建業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/sokatsuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "takken_registry",
          "line": 449,
          "module_chain": [
            "backend.crawlers.sources.takken_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "takken_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 7 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 7 日 11:00",
          "command": "python3 -m backend.crawlers.sources.takken_registry",
          "modules": [
            "backend.crawlers.sources.takken_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-07T11:00:00+09:00",
              "beijing": "2026-11-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-07T11:00:00+09:00",
              "beijing": "2026-12-07T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-07T11:00:00+09:00",
              "beijing": "2027-01-07T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 449,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 248,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            )\n            VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                jsonb_build_object('rps', 0.5, 'scope', 'Japan dishonor and bankruptcy notices'),\n                jsonb_build_object(\n                    'source_page_confirmed_at', '2026-05-31',\n                    'scope', 'Japan public corporate dishonor and insolvency table facts'\n                )\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_activ"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "seikei_bankruptcies",
      "crawler": "backend/crawlers/sources/seikei_bankruptcies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "seikei_bankruptcies",
          "enabled": true,
          "line": 210
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "セイケイデータ 不渡り・倒産情報",
      "source_url": "https://www.seikei.co.jp/information/bankruptcies/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.seikei.co.jp/information/bankruptcies/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "seikei_bankruptcies",
          "line": 210,
          "module_chain": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "seikei_bankruptcies",
          "scheduler": "schedule.yaml",
          "cron": "15 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:15",
          "command": "python3 -m backend.crawlers.sources.seikei_bankruptcies --recent-months 18 --rps 0.5",
          "modules": [
            "backend.crawlers.sources.seikei_bankruptcies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 35,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:15:00+09:00",
              "beijing": "2026-11-04T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:15:00+09:00",
              "beijing": "2026-11-05T07:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:15:00+09:00",
              "beijing": "2026-11-06T07:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 210,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 83,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gyoseishoshi",
          "enabled": true,
          "line": 443
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "行政書士検索",
      "source_url": "https://www.gyosei.or.jp/members-search",
      "crawler_url_candidates": [
        {
          "url": "https://www.gyosei.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/api/v1/members/{member_id}",
          "symbol": "DETAIL_URL_FMT",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 407,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gyoseishoshi",
          "line": 443,
          "module_chain": [
            "backend.crawlers.sources.gyoseishoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "gyoseishoshi",
      "crawler": "backend/crawlers/sources/gyoseishoshi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 83,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gyoseishoshi",
          "enabled": true,
          "line": 443
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "行政書士検索",
      "source_url": "https://www.gyosei.or.jp/members-search",
      "crawler_url_candidates": [
        {
          "url": "https://www.gyosei.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/api/v1/members/{member_id}",
          "symbol": "DETAIL_URL_FMT",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://www.gyosei.or.jp/members-search",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 407,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gyoseishoshi",
          "line": 443,
          "module_chain": [
            "backend.crawlers.sources.gyoseishoshi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gyoseishoshi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 11:00",
          "command": "python3 -m backend.crawlers.sources.gyoseishoshi --all",
          "modules": [
            "backend.crawlers.sources.gyoseishoshi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T11:00:00+09:00",
              "beijing": "2026-11-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T11:00:00+09:00",
              "beijing": "2026-12-06T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T11:00:00+09:00",
              "beijing": "2027-01-06T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 443,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 106,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "eco_action21",
          "enabled": true,
          "line": 597
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "source_url": "https://www.ea21.jp/register/ninsho_search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ea21.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 101,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/last_month_certification.pdf",
          "symbol": "PDF_LASTMONTH",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 102,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/recyclable_food.pdf",
          "symbol": "PDF_RECYC",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 103,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/ninsho.pdf",
          "symbol": "PDF_STATS",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 104,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "eco_action21",
          "line": 597,
          "module_chain": [
            "backend.crawlers.sources.eco_action21"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "eco_action21",
      "crawler": "backend/crawlers/sources/eco_action21.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 106,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "eco_action21",
          "enabled": true,
          "line": 597
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "エコアクション21 認証・登録事業者 (環境省 / IPSuS)",
      "source_url": "https://www.ea21.jp/register/ninsho_search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ea21.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/register/ninsho_list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 101,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/last_month_certification.pdf",
          "symbol": "PDF_LASTMONTH",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 102,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/recyclable_food.pdf",
          "symbol": "PDF_RECYC",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 103,
          "origin": "online"
        },
        {
          "url": "https://www.ea21.jp/files/ninsho_search/ninsho.pdf",
          "symbol": "PDF_STATS",
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 104,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "eco_action21",
          "line": 597,
          "module_chain": [
            "backend.crawlers.sources.eco_action21"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "eco_action21",
          "scheduler": "schedule.yaml",
          "cron": "0 6 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 06:00",
          "command": "python3 -m backend.crawlers.sources.eco_action21",
          "modules": [
            "backend.crawlers.sources.eco_action21"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T06:00:00+09:00",
              "beijing": "2026-12-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T06:00:00+09:00",
              "beijing": "2027-01-05T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 597,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 279,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hotel_ryokan_intl",
          "enabled": true,
          "line": 557
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "crawler_url_candidates": [
        {
          "url": "https://www.hokoukukan.go.jp/metadata/detail/30",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 66,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hotel_ryokan_intl",
          "line": 557,
          "module_chain": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "hotel_ryokan_intl",
      "crawler": "backend/crawlers/sources/hotel_ryokan_intl.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 279,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hotel_ryokan_intl",
          "enabled": true,
          "line": 557
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/mlit_20170316_0021",
      "crawler_url_candidates": [
        {
          "url": "https://www.hokoukukan.go.jp/metadata/detail/30",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 66,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hotel_ryokan_intl",
          "line": 557,
          "module_chain": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "hotel_ryokan_intl",
          "scheduler": "schedule.yaml",
          "cron": "0 5 1 */3 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 1 日 05:00",
          "command": "python3 -m backend.crawlers.sources.hotel_ryokan_intl",
          "modules": [
            "backend.crawlers.sources.hotel_ryokan_intl"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-01T05:00:00+09:00",
              "beijing": "2027-01-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-01T05:00:00+09:00",
              "beijing": "2027-04-01T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-01T05:00:00+09:00",
              "beijing": "2027-07-01T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 557,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 362,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "osakaben",
      "crawler": "backend/crawlers/sources/osakaben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 335,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 378,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "osakaben",
          "enabled": true,
          "line": 986
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "大阪弁護士会 会員検索",
      "source_url": "https://www.osakaben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 114,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search2.php",
          "symbol": "SEARCH2_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 115,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/basic_search3.php",
          "symbol": "SEARCH3_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 116,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 117,
          "origin": "online"
        },
        {
          "url": "https://www.osakaben.or.jp/web/lawyersearch/result.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 521,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "osakaben",
          "line": 986,
          "module_chain": [
            "backend.crawlers.sources.osakaben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "osakaben",
          "scheduler": "schedule.yaml",
          "cron": "0 10 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 10:00",
          "command": "python3 -m backend.crawlers.sources.osakaben",
          "modules": [
            "backend.crawlers.sources.osakaben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T10:00:00+09:00",
              "beijing": "2026-11-09T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T10:00:00+09:00",
              "beijing": "2026-11-16T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T10:00:00+09:00",
              "beijing": "2026-11-23T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 986,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 248,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "keidanren_members",
          "enabled": true,
          "line": 363
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経団連 会員一覧",
      "source_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/",
          "symbol": "PORTAL",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 271,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "keidanren_members",
          "line": 363,
          "module_chain": [
            "backend.crawlers.sources.keidanren_members"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "keidanren_members",
      "crawler": "backend/crawlers/sources/keidanren_members.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 248,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "keidanren_members",
          "enabled": true,
          "line": 363
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "経団連 会員一覧",
      "source_url": "https://www.keidanren.or.jp/profile/kaiin/",
      "crawler_url_candidates": [
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/",
          "symbol": "PORTAL",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.keidanren.or.jp/profile/kaiin/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 271,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "keidanren_members",
          "line": 363,
          "module_chain": [
            "backend.crawlers.sources.keidanren_members"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "keidanren_members",
          "scheduler": "schedule.yaml",
          "cron": "0 11 4 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 4 日 11:00",
          "command": "python3 -m backend.crawlers.sources.keidanren_members",
          "modules": [
            "backend.crawlers.sources.keidanren_members"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T11:00:00+09:00",
              "beijing": "2026-11-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-04T11:00:00+09:00",
              "beijing": "2026-12-04T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-04T11:00:00+09:00",
              "beijing": "2027-01-04T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 363,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 149,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jpx_listed",
      "crawler": "backend/crawlers/sources/jpx_listed.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 149,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpx_listed",
          "enabled": true,
          "line": 312
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "JPX 上場会社情報",
      "source_url": "https://www.jpx.co.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jpx.co.jp/markets/statistics-equities/misc/tvdivq0000001vg2-att/data_j.xls",
          "symbol": "XLS_URL",
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jpx_listed",
          "line": 312,
          "module_chain": [
            "backend.crawlers.sources.jpx_listed"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpx_listed",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:00",
          "command": "python3 -m backend.crawlers.sources.jpx_listed",
          "modules": [
            "backend.crawlers.sources.jpx_listed"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:00:00+09:00",
              "beijing": "2026-11-10T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:00:00+09:00",
              "beijing": "2026-11-17T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:00:00+09:00",
              "beijing": "2026-11-24T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 312,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 251,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 275,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kanpo_tremolo",
          "enabled": true,
          "line": 640
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "官報決算データサービス (tremolo)",
      "source_url": "https://kanpo.tremolo.work/",
      "crawler_url_candidates": [
        {
          "url": "https://kanpo.tremolo.work",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/kessan",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/{id}",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_tremolo",
          "line": 640,
          "module_chain": [
            "backend.crawlers.sources.kanpo_tremolo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "kanpo_tremolo",
      "crawler": "backend/crawlers/sources/kanpo_tremolo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 251,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 275,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kanpo_tremolo",
          "enabled": true,
          "line": 640
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "官報決算データサービス (tremolo)",
      "source_url": "https://kanpo.tremolo.work/",
      "crawler_url_candidates": [
        {
          "url": "https://kanpo.tremolo.work",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/kessan",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://kanpo.tremolo.work/disclosures/{id}",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kanpo_tremolo",
          "line": 640,
          "module_chain": [
            "backend.crawlers.sources.kanpo_tremolo"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kanpo_tremolo",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:30",
          "command": "python3 -m backend.crawlers.sources.kanpo_tremolo --total-pages 30 --rps 1.0",
          "modules": [
            "backend.crawlers.sources.kanpo_tremolo"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:30:00+09:00",
              "beijing": "2026-11-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:30:00+09:00",
              "beijing": "2026-11-17T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:30:00+09:00",
              "beijing": "2026-11-24T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 640,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jgrants",
      "crawler": "backend/crawlers/sources/jgrants.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 133,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgrants",
          "enabled": true,
          "line": 1066
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "jGrants 補助金",
      "source_url": "https://www.jgrants-portal.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.jgrants-portal.go.jp/exp",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies",
          "symbol": "url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://api.jgrants-portal.go.jp/exp/v1/public/subsidies/id/{dynamic}",
          "symbol": "detail_url",
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 171,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgrants",
          "line": 1066,
          "module_chain": [
            "backend.crawlers.sources.jgrants"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jgrants",
          "scheduler": "schedule.yaml",
          "cron": "30 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:30",
          "command": "python3 -m backend.crawlers.sources.jgrants",
          "modules": [
            "backend.crawlers.sources.jgrants"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:30:00+09:00",
              "beijing": "2026-11-04T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:30:00+09:00",
              "beijing": "2026-11-05T16:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:30:00+09:00",
              "beijing": "2026-11-06T16:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1066,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 70,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jcia_cosmetics",
          "enabled": true,
          "line": 994
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本化粧品工業会 会員企業一覧",
      "source_url": "https://www.jcia.org/admin/memberlist",
      "crawler_url_candidates": [
        {
          "url": "https://www.jcia.org/admin/memberlist",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.jcia.org/admin/memberlist{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jcia_cosmetics",
          "line": 994,
          "module_chain": [
            "backend.crawlers.sources.jcia_cosmetics"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jcia_cosmetics",
      "crawler": "backend/crawlers/sources/jcia_cosmetics.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 70,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jcia_cosmetics",
          "enabled": true,
          "line": 994
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本化粧品工業会 会員企業一覧",
      "source_url": "https://www.jcia.org/admin/memberlist",
      "crawler_url_candidates": [
        {
          "url": "https://www.jcia.org/admin/memberlist",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.jcia.org/admin/memberlist{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 295,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jcia_cosmetics",
          "line": 994,
          "module_chain": [
            "backend.crawlers.sources.jcia_cosmetics"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jcia_cosmetics",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:00",
          "command": "python3 -m backend.crawlers.sources.jcia_cosmetics",
          "modules": [
            "backend.crawlers.sources.jcia_cosmetics"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:00:00+09:00",
              "beijing": "2026-11-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:00:00+09:00",
              "beijing": "2026-11-17T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:00:00+09:00",
              "beijing": "2026-11-24T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 994,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 473,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (\n                code, name_ja, name_en, category, authority, base_url,\n                license_type, priority, is_active, crawl_config, compliance_record\n            )\n            VALUES (\n                %s, %s, %s, %s, %s, %s,\n                %s, %s, TRUE,\n                jsonb_build_object('rps', 0.2, 'country', 'Japan', 'mode', 'public-watchlist-facts'),\n                jsonb_build_object(\n                    'source_page_confirmed_at', '2026-05-31',\n                    'scope', 'Japan country-filtered debtor and blacklist facts only'\n                )\n            )\n            ON CONFLICT (code) DO UPDATE SET\n                name_ja=EXCLUDED.name_ja,\n                name_en=EXCLUDED.name_en,\n                category=EXCLUDED.category,\n                authority=EXCLUDED.authority,\n                base_url=EXCLUDED.base_url,\n                license_type=EXCLUDED.license_type,\n                priority=EXCLUDED.priority,\n                is_activ"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "freight_debt_watchlists",
      "crawler": "backend/crawlers/sources/freight_debt_watchlists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "freight_debt_watchlists",
          "enabled": true,
          "line": 204
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国際物流 債務不履行ウォッチリスト",
      "source_url": "https://fdrs-ltd.com/delinquent-debtors/",
      "crawler_url_candidates": [
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "FDRS_WARNINGLIST_URL",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://fdrs-ltd.com/delinquent-debtors/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 588,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "freight_debt_watchlists",
          "line": 204,
          "module_chain": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "freight_debt_watchlists",
          "scheduler": "schedule.yaml",
          "cron": "50 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:50",
          "command": "python3 -m backend.crawlers.sources.freight_debt_watchlists --country Japan",
          "modules": [
            "backend.crawlers.sources.freight_debt_watchlists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 25,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:50:00+09:00",
              "beijing": "2026-11-04T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:50:00+09:00",
              "beijing": "2026-11-05T06:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:50:00+09:00",
              "beijing": "2026-11-06T06:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 204,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jnet21_support_programs",
      "crawler": "backend/crawlers/sources/jnet21_support_programs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jnet21_support_programs",
          "enabled": true,
          "line": 677
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "enabled": true,
          "line": 683
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-Net21 支援情報ヘッドライン 補助金・助成金・融資",
      "source_url": "https://j-net21.smrj.go.jp/snavi2/",
      "crawler_url_candidates": [
        {
          "url": "https://j-net21.smrj.go.jp/snavi/support/support.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/results.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://j-net21.smrj.go.jp/snavi2/",
          "symbol": "DETAIL_BASE",
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jnet21_support_programs",
          "line": 677,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "line": 683,
          "module_chain": [
            "backend.crawlers.sources.jnet21_support_programs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jnet21_support_programs",
          "scheduler": "schedule.yaml",
          "cron": "45 2 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 02:45",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode rss --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T02:45:00+09:00",
              "beijing": "2026-11-04T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T02:45:00+09:00",
              "beijing": "2026-11-05T01:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T02:45:00+09:00",
              "beijing": "2026-11-06T01:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 677,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "scheduler": "schedule.yaml",
          "cron": "20 3 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 03:20",
          "command": "python3 -m backend.crawlers.sources.jnet21_support_programs --mode full --shard-prefectures --sleep 0.5",
          "modules": [
            "backend.crawlers.sources.jnet21_support_programs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "backfill",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T03:20:00+09:00",
              "beijing": "2026-11-09T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T03:20:00+09:00",
              "beijing": "2026-11-16T02:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T03:20:00+09:00",
              "beijing": "2026-11-23T02:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 683,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3,
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/crawlers/sources/reinfolib.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 119,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        3,
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external",
          "symbol": "API_BASE",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 122,
          "origin": "online"
        },
        {
          "url": "https://www.reinfolib.mlit.go.jp/ex-api/external/{dynamic}",
          "symbol": "url",
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.reinfolib_incremental",
            "backend.crawlers.sources.reinfolib"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 275,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 293,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaigo_facilities",
          "enabled": true,
          "line": 455
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "厚労省 介護サービス情報公表システム オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 63,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 64,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaigo_facilities",
          "line": 455,
          "module_chain": [
            "backend.crawlers.sources.kaigo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "kaigo_facilities",
      "crawler": "backend/crawlers/sources/kaigo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 275,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 293,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaigo_facilities",
          "enabled": true,
          "line": 455
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "厚労省 介護サービス情報公表システム オープンデータ",
      "source_url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 63,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 64,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaigo_facilities",
          "line": 455,
          "module_chain": [
            "backend.crawlers.sources.kaigo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaigo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 12 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 12:00",
          "command": "python3 -m backend.crawlers.sources.kaigo_facilities",
          "modules": [
            "backend.crawlers.sources.kaigo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T12:00:00+09:00",
              "beijing": "2026-11-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T12:00:00+09:00",
              "beijing": "2026-12-08T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T12:00:00+09:00",
              "beijing": "2027-01-08T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 455,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 282,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "bengoshikai",
      "crawler": "backend/crawlers/sources/bengoshikai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 272,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 298,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "bengoshikai",
          "enabled": true,
          "line": 355
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "ひまわりサーチ",
      "source_url": "https://www.bengoshikai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.bengoshikai.jp/search/sitemap.php",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 87,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.bengoshikai.jp/search/detail.php",
          "symbol": "canonical",
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 266,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "bengoshikai",
          "line": 355,
          "module_chain": [
            "backend.crawlers.sources.bengoshikai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "bengoshikai",
          "scheduler": "schedule.yaml",
          "cron": "0 11 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 11:00",
          "command": "python3 -m backend.crawlers.sources.bengoshikai",
          "modules": [
            "backend.crawlers.sources.bengoshikai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T11:00:00+09:00",
              "beijing": "2026-12-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T11:00:00+09:00",
              "beijing": "2027-01-03T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T11:00:00+09:00",
              "beijing": "2027-02-03T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 355,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 46,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n                VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 介護サービス情報公表",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kaigo_jigyosho",
      "crawler": "backend/crawlers/sources/kaigo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 介護サービス情報公表",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/kaigo-kouhyou_opendata.html",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://www.mhlw.go.jp",
          "symbol": "CSV_BASE",
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 247,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (code, name_ja, name_en, category, authority,\n                                  base_url, license_type, priority, is_active,\n                                  crawl_config)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, TRUE, %s::jsonb)\n        ON CONFLICT (code) DO UPDATE SET updated_at=now()\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        1,
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_html_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_html_done",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 81,
          "origin": "online",
          "kind": "sql_write",
          "sql": "INSERT INTO gbizinfo_html_done (corporate_number, http_status, has_url) VALUES (%s, %s, %s) ON CONFLICT (corporate_number) DO UPDATE SET http_status=EXCLUDED.http_status, has_url=EXCLUDED.has_url, fetched_at=now()"
        }
      ],
      "dimensions": [
        1,
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/crawlers/sources/gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1,
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/ichiran",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 88,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ]
        }
      ],
      "schedule_state": "enabled_static_reference",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch",
            "backend.crawlers.sources.gbizinfo_html"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "static_reference_only",
      "schedule_coverage_note": "仅父任务引用周期，不能认定完整程序定时运行",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "egov_law",
      "crawler": "backend/crawlers/sources/egov_law.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 137,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "egov_law",
          "enabled": true,
          "line": 1057
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "e-Gov 法令検索 API",
      "source_url": "https://laws.e-gov.go.jp/apitop/",
      "crawler_url_candidates": [
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "API",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://laws.e-gov.go.jp/api/2/laws",
          "symbol": "url",
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 118,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "egov_law",
          "line": 1057,
          "module_chain": [
            "backend.crawlers.sources.egov_law"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "egov_law",
          "scheduler": "schedule.yaml",
          "cron": "0 17 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 17:00",
          "command": "python3 -m backend.crawlers.sources.egov_law",
          "modules": [
            "backend.crawlers.sources.egov_law"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T17:00:00+09:00",
              "beijing": "2026-11-04T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T17:00:00+09:00",
              "beijing": "2026-11-05T16:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T17:00:00+09:00",
              "beijing": "2026-11-06T16:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1057,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 291,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url, priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "satsuben",
      "crawler": "backend/crawlers/sources/satsuben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 281,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 306,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "satsuben",
          "enabled": true,
          "line": 971
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "札幌弁護士会 弁護士検索",
      "source_url": "https://www.satsuben.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.satsuben.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 106,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/list.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 107,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "PROFILE_URL",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.satsuben.or.jp/search/profile.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 360,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "satsuben",
          "line": 971,
          "module_chain": [
            "backend.crawlers.sources.satsuben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "satsuben",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:30",
          "command": "python3 -m backend.crawlers.sources.satsuben",
          "modules": [
            "backend.crawlers.sources.satsuben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:30:00+09:00",
              "beijing": "2026-11-09T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:30:00+09:00",
              "beijing": "2026-11-16T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:30:00+09:00",
              "beijing": "2026-11-23T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 971,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "benrishi_navi",
          "enabled": true,
          "line": 349
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "弁理士ナビ",
      "source_url": "https://www.benrishi-navi.com/",
      "crawler_url_candidates": [
        {
          "url": "https://www.benrishi-navi.com",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "ENDPOINT",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 228,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "benrishi_navi",
          "line": 349,
          "module_chain": [
            "backend.crawlers.sources.benrishi_navi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "benrishi_navi",
      "crawler": "backend/crawlers/sources/benrishi_navi.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "benrishi_navi",
          "enabled": true,
          "line": 349
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "弁理士ナビ",
      "source_url": "https://www.benrishi-navi.com/",
      "crawler_url_candidates": [
        {
          "url": "https://www.benrishi-navi.com",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 99,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "ENDPOINT",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 100,
          "origin": "online"
        },
        {
          "url": "https://www.benrishi-navi.com/search/advanced",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 228,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "benrishi_navi",
          "line": 349,
          "module_chain": [
            "backend.crawlers.sources.benrishi_navi"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "benrishi_navi",
          "scheduler": "schedule.yaml",
          "cron": "0 11 2 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 2 日 11:00",
          "command": "python3 -m backend.crawlers.sources.benrishi_navi",
          "modules": [
            "backend.crawlers.sources.benrishi_navi"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-02T11:00:00+09:00",
              "beijing": "2026-12-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-02T11:00:00+09:00",
              "beijing": "2027-01-02T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-02T11:00:00+09:00",
              "beijing": "2027-02-02T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 349,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/fben.py",
          "line": 339,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n                INSERT INTO data_sources (\n                    code, name_ja, category, authority, base_url,\n                    priority, is_active\n                ) VALUES (%s, %s, %s, %s, %s, %s, TRUE)\n                ON CONFLICT (code) DO NOTHING\n                "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fben",
      "crawler": "backend/crawlers/sources/fben.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 328,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 355,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fben",
          "enabled": true,
          "line": 964
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "福岡県弁護士会 弁護士検索",
      "source_url": "https://www.fben.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fben.jp/search/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_search.php",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 109,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/fben.py",
          "line": 110,
          "origin": "online"
        },
        {
          "url": "https://www.fben.jp/search/lawyers_info.php",
          "symbol": "url",
          "file": "backend/crawlers/sources/fben.py",
          "line": 447,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fben",
          "line": 964,
          "module_chain": [
            "backend.crawlers.sources.fben"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fben",
          "scheduler": "schedule.yaml",
          "cron": "0 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:00",
          "command": "python3 -m backend.crawlers.sources.fben",
          "modules": [
            "backend.crawlers.sources.fben"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:00:00+09:00",
              "beijing": "2026-11-09T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:00:00+09:00",
              "beijing": "2026-11-16T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:00:00+09:00",
              "beijing": "2026-11-23T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 964,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 674,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "なでしこ銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "nadeshiko_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 674,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "なでしこ銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 676,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "kenko_keiei_meigara",
      "crawler": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 676,
          "kind": "exact_registered_code_literal",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "健康経営銘柄 (経産省+TSE)",
      "source_url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity",
          "symbol": "BASE_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/downloadfiles",
          "symbol": "BASE_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 90,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/economy/jinzai/diversity/nadeshiko.html",
          "symbol": "LANDING_NADESHIKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 91,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/mono_info_service/healthcare/kenko_meigara.html",
          "symbol": "LANDING_KENKO",
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 92,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 75,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jaha_animal_hospitals",
          "enabled": true,
          "line": 1001
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "JAHA認定動物病院一覧",
      "source_url": "https://animal-hospital.jaha.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://animal-hospital.jaha.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://animal-hospital.jaha.or.jp/post-sitemap.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jaha_animal_hospitals",
          "line": 1001,
          "module_chain": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jaha_animal_hospitals",
      "crawler": "backend/crawlers/sources/jaha_animal_hospitals.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 75,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jaha_animal_hospitals",
          "enabled": true,
          "line": 1001
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "JAHA認定動物病院一覧",
      "source_url": "https://animal-hospital.jaha.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://animal-hospital.jaha.or.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 79,
          "origin": "online"
        },
        {
          "url": "https://animal-hospital.jaha.or.jp/post-sitemap.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jaha_animal_hospitals",
          "line": 1001,
          "module_chain": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jaha_animal_hospitals",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:30",
          "command": "python3 -m backend.crawlers.sources.jaha_animal_hospitals",
          "modules": [
            "backend.crawlers.sources.jaha_animal_hospitals"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:30:00+09:00",
              "beijing": "2026-11-10T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:30:00+09:00",
              "beijing": "2026-11-17T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:30:00+09:00",
              "beijing": "2026-11-24T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1001,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 93,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mof_sanctions",
          "enabled": true,
          "line": 54
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "外務省 経済制裁",
      "source_url": "https://www.mofa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mof.go.jp/policy/international_policy/gaitame_kawase/gaitame/economic_sanctions/list.html",
          "symbol": "LIST_PAGE",
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mof_sanctions",
          "line": 54,
          "module_chain": [
            "backend.crawlers.sources.mof_sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mofa_sanctions",
      "crawler": "backend/crawlers/sources/mof_sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 93,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mof_sanctions",
          "enabled": true,
          "line": 54
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "外務省 経済制裁",
      "source_url": "https://www.mofa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mof.go.jp/policy/international_policy/gaitame_kawase/gaitame/economic_sanctions/list.html",
          "symbol": "LIST_PAGE",
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mof_sanctions",
          "line": 54,
          "module_chain": [
            "backend.crawlers.sources.mof_sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mof_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "25 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:25",
          "command": "python3 -m backend.crawlers.sources.mof_sanctions",
          "modules": [
            "backend.crawlers.sources.mof_sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:25:00+09:00",
              "beijing": "2026-11-04T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:25:00+09:00",
              "beijing": "2026-11-05T02:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:25:00+09:00",
              "beijing": "2026-11-06T02:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 54,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 104,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jicpa_registry",
          "enabled": true,
          "line": 343
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "日本公認会計士協会 公認会計士等検索システム",
      "source_url": "https://registry.jicpa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://registry.jicpa.or.jp/cpa_search",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 92,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 93,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_search",
          "symbol": "AUDIT_LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 95,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "AUDIT_DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 96,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 529,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 422,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jicpa_registry",
          "line": 343,
          "module_chain": [
            "backend.crawlers.sources.jicpa_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jicpa_registry",
      "crawler": "backend/crawlers/sources/jicpa_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 104,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jicpa_registry",
          "enabled": true,
          "line": 343
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "日本公認会計士協会 公認会計士等検索システム",
      "source_url": "https://registry.jicpa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://registry.jicpa.or.jp/cpa_search",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 92,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_search",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 93,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_search",
          "symbol": "AUDIT_LIST_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 95,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "AUDIT_DETAIL_URL",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 96,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/ms_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 529,
          "origin": "online"
        },
        {
          "url": "https://registry.jicpa.or.jp/cpa_search/audit_detail",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 422,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jicpa_registry",
          "line": 343,
          "module_chain": [
            "backend.crawlers.sources.jicpa_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jicpa_registry",
          "scheduler": "schedule.yaml",
          "cron": "0 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:00",
          "command": "python3 -m backend.crawlers.sources.jicpa_registry --full",
          "modules": [
            "backend.crawlers.sources.jicpa_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:00:00+09:00",
              "beijing": "2026-12-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:00:00+09:00",
              "beijing": "2027-01-01T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:00:00+09:00",
              "beijing": "2027-02-01T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 343,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "construction_licenses",
          "enabled": true,
          "line": 587
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "建設業者 全国 (国交省 + 47都道府県)",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/ksGaiyo.do",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "construction_licenses",
          "line": 587,
          "module_chain": [
            "backend.crawlers.sources.construction_licenses"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "construction_licenses",
      "crawler": "backend/crawlers/sources/construction_licenses.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "construction_licenses",
          "enabled": true,
          "line": 587
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "建設業者 全国 (国交省 + 47都道府県)",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/kensetuKensaku.do",
          "symbol": "ENTRY_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/ksGaiyo.do",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 63,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "construction_licenses",
          "line": 587,
          "module_chain": [
            "backend.crawlers.sources.construction_licenses"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "construction_licenses",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.construction_licenses --full",
          "modules": [
            "backend.crawlers.sources.construction_licenses"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 587,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "field_lineage",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "field_lineage",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 561,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO field_lineage (\n            table_name, column_name, source_code, source_name_cn,\n            parser_module, parser_function, parser_logic,\n            example_value, description, last_written_at, parser_version\n        ) VALUES (\n            'npo_facilities', %(col)s, 'npo_houjin', 'NPO 法人 portal (内閣府)',\n            'backend.crawlers.sources.npo_facilities', 'parse_csv_row', %(logic)s,\n            %(example)s, %(desc)s, now(), %(ver)s\n        )\n        ON CONFLICT (table_name, column_name) DO UPDATE SET\n            source_code     = EXCLUDED.source_code,\n            source_name_cn  = EXCLUDED.source_name_cn,\n            parser_module   = EXCLUDED.parser_module,\n            parser_function = EXCLUDED.parser_function,\n            parser_logic    = EXCLUDED.parser_logic,\n            example_value   = EXCLUDED.example_value,\n            description     = EXCLUDED.description,\n            last_written_at = now(),\n            parser_version  = EXCLUDED.parser_version\n  "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "字段溯源元数据"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "npo_houjin",
      "crawler": "backend/crawlers/sources/npo_facilities.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 91,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "npo_facilities",
          "enabled": true,
          "line": 1183
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        4
      ],
      "source_name": "NPO 法人ポータルサイト (内閣府)",
      "source_url": "https://www.npo-homepage.go.jp/npoportal/",
      "crawler_url_candidates": [
        {
          "url": "https://www.npo-homepage.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://www.npo-homepage.go.jp/npoportal/download/zip/houjin_{n:03d}.zip",
          "symbol": "ZIP_URL_TPL",
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 89,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "npo_facilities",
          "line": 1183,
          "module_chain": [
            "backend.crawlers.sources.npo_facilities"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npo_facilities",
          "scheduler": "schedule.yaml",
          "cron": "0 10 15 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 15 日 10:00",
          "command": "python3 -m backend.crawlers.sources.npo_facilities --full",
          "modules": [
            "backend.crawlers.sources.npo_facilities"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-15T10:00:00+09:00",
              "beijing": "2026-11-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-15T10:00:00+09:00",
              "beijing": "2026-12-15T09:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-15T10:00:00+09:00",
              "beijing": "2027-01-15T09:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1183,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 483,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sbt_certified",
          "enabled": true,
          "line": 575
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SBT (Science Based Targets) 認定企業 — 日本",
      "source_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "crawler_url_candidates": [
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "COMPANIES_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "TARGETS_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 510,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 516,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sbt_certified",
          "line": 575,
          "module_chain": [
            "backend.crawlers.sources.sbt_certified"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sbt_certified",
      "crawler": "backend/crawlers/sources/sbt_certified.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 483,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sbt_certified",
          "enabled": true,
          "line": 575
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SBT (Science Based Targets) 認定企業 — 日本",
      "source_url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
      "crawler_url_candidates": [
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "COMPANIES_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 88,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "TARGETS_URL",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 89,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/companies-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 510,
          "origin": "online"
        },
        {
          "url": "https://files.sciencebasedtargets.org/production/files/targets-excel.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 516,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sbt_certified",
          "line": 575,
          "module_chain": [
            "backend.crawlers.sources.sbt_certified"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sbt_certified",
          "scheduler": "schedule.yaml",
          "cron": "0 12 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 12:00",
          "command": "python3 -m backend.crawlers.sources.sbt_certified",
          "modules": [
            "backend.crawlers.sources.sbt_certified"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T12:00:00+09:00",
              "beijing": "2026-11-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T12:00:00+09:00",
              "beijing": "2026-12-05T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T12:00:00+09:00",
              "beijing": "2027-01-05T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 575,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "catr_kanpo",
      "crawler": "backend/crawlers/sources/catr_kanpo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 53,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_discovered_urls",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_discovered_urls",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 906,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_discovered_urls (\n            source_id, source_record_type, source_record_id,\n            source_url, source_url_hash, discovery_scope,\n            discovered_from_url, discovery_context\n        ) VALUES (%s, %s, %s, %s, %s, %s, %s, %s::jsonb)\n        ON CONFLICT (source_id, source_url_hash)\n        DO UPDATE SET\n            source_record_id = COALESCE(EXCLUDED.source_record_id, kanpo_discovered_urls.source_record_id),\n            discovery_scope = CASE\n                WHEN kanpo_discovered_urls.status = 'fetched' THEN kanpo_discovered_urls.discovery_scope\n                ELSE EXCLUDED.discovery_scope\n            END,\n            discovered_from_url = CASE\n                WHEN kanpo_discovered_urls.status = 'fetched' THEN kanpo_discovered_urls.discovered_from_url\n                ELSE COALESCE(EXCLUDED.discovered_from_url, kanpo_discovered_urls.discovered_from_url)\n            END,\n            discovery_context = kanpo_discovered_urls.discovery_context || EXC"
        },
        {
          "table": "kanpo_discovered_urls",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 976,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE kanpo_discovered_urls\n           SET status = %s,\n               attempts = attempts + 1,\n               last_error = %s,\n               fetched_at = CASE WHEN %s = 'fetched' THEN now() ELSE fetched_at END,\n               last_seen_at = now()\n         WHERE source_id = %s\n           AND source_url = ANY(%s)\n        "
        }
      ],
      "dimensions": [
        8,
        11
      ],
      "source_name": "CatR 官報決算データベース",
      "source_url": "https://catr.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://catr.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "官报待抓取 URL 队列"
    },
    {
      "source": "invoice_kohyo_api_v1",
      "crawler": "backend/scripts/import_invoice_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 360,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "invoice_kohyo_api_daily",
          "enabled": true,
          "line": 411
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 適格請求書発行事業者 Web-API v1",
      "source_url": "https://web-api.invoice-kohyo.nta.go.jp/1/",
      "crawler_url_candidates": [
        {
          "url": "https://web-api.invoice-kohyo.nta.go.jp/1",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "invoice_kohyo_api_daily",
          "line": 411,
          "module_chain": [
            "backend.scripts.import_invoice_via_api"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "invoice_kohyo_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 22 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 22:30",
          "command": "python3 -m backend.scripts.import_invoice_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_invoice_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T22:30:00+09:00",
              "beijing": "2026-11-03T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T22:30:00+09:00",
              "beijing": "2026-11-04T21:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T22:30:00+09:00",
              "beijing": "2026-11-05T21:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 411,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "miyagi_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 270,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '宮城県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Miyagi prefecture public excellent industrial-waste licensee Excel exposes representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "宮城県 優良産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.miyagi.jp/soshiki/haitai/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "hanshin_expressway_qualified_suppliers",
      "crawler": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "enabled": true,
          "line": 878
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 251,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '阪神高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Hanshin Expressway public qualified-supplier PDFs expose representative titles and names; importer only inserts unique local matches by company name and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "阪神高速道路 有資格者名簿",
      "source_url": "https://www.hanshin-exp.co.jp/company/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.hanshin-exp.co.jp/company/meibo.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 336,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "tokyo_taishin_architect",
      "crawler": "backend/scripts/import_tokyo_taishin_architect_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tokyo_taishin_architect",
          "enabled": true,
          "line": 896
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 306,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Tokyo Metropolitan Government', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public Tokyo seismic diagnosis office register. Corporate-number match requires unique normalized legal entity name plus postal code.',\n             'source_page_url', %s::text,\n             'source_pdf_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都木造住宅耐震診断事務所登録名簿",
      "source_url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
      "crawler_url_candidates": [
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/renew/assets/pdf/office_list_1.pdf",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.taishin.metro.tokyo.lg.jp/home/shindan-jimusho.php",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 391,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tokyo_taishin_architect",
          "line": 896,
          "module_chain": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "tokyo_taishin_architect",
          "scheduler": "schedule.yaml",
          "cron": "0 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:00",
          "command": "python3 -m backend.scripts.import_tokyo_taishin_architect_reps --apply",
          "modules": [
            "backend.scripts.import_tokyo_taishin_architect_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:00:00+09:00",
              "beijing": "2027-01-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:00:00+09:00",
              "beijing": "2027-04-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:00:00+09:00",
              "beijing": "2027-07-10T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 896,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 285,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '香川県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kagawa prefecture public industrial-waste licensee PDFs expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "香川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagawa.lg.jp/junkan/haikibutsu/kfvn.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "university_portrait_private_school",
      "crawler": "backend/scripts/import_university_portrait_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "university_portrait_private_school",
          "enabled": true,
          "line": 884
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 348,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '日本私立学校振興・共済事業団 / 大学ポートレート（私学版）', %s, 'public_html',\n           64, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大学ポートレート（私学版）法人情報",
      "source_url": "https://up-j.shigaku.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "SITEMAP_URL",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 555,
          "origin": "online"
        },
        {
          "url": "https://up-j.shigaku.go.jp/sitemap/sitemap_category09.xml",
          "symbol": "sitemap_url",
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 556,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "university_portrait_private_school",
          "line": 884,
          "module_chain": [
            "backend.scripts.import_university_portrait_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "university_portrait_private_school",
          "scheduler": "schedule.yaml",
          "cron": "0 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:00",
          "command": "python3 -m backend.scripts.import_university_portrait_representatives --sleep 0.08 --apply",
          "modules": [
            "backend.scripts.import_university_portrait_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:00:00+09:00",
              "beijing": "2027-01-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:00:00+09:00",
              "beijing": "2027-04-10T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:00:00+09:00",
              "beijing": "2027-07-10T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 884,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "ibaraki_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 300,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '茨城県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ibaraki prefecture public excellent industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "茨城県 優良産廃処理業者認定業者一覧",
      "source_url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ibaraki.jp/seikatsukankyo/haitai/fuho/fuho-toki/yuryo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kumamoto_religious_corporations",
      "crawler": "backend/scripts/import_kumamoto_religious_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kumamoto_religious_corporations",
          "enabled": true,
          "line": 890
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 215,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '熊本県 / BODIK オープンデータカタログ', %s, 'public_xlsx',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kumamoto Prefecture religious corporation list. Corporate-number match requires unique normalized corporation name plus address.',\n             'source_page_url', %s::text,\n             'xlsx_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "熊本県 宗教法人名簿",
      "source_url": "https://data.bodik.jp/dataset/430005_00107",
      "crawler_url_candidates": [
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/d8ad9958-6493-4ddd-96f7-d15e4a00c0ef/resource/5c7a5bbb-b91a-4af1-a5e0-679ee25f6716/download/123_r7.8.1.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://data.bodik.jp/dataset/430005_00107",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kumamoto_religious_corporations",
          "line": 890,
          "module_chain": [
            "backend.scripts.import_kumamoto_religious_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kumamoto_religious_corporations",
          "scheduler": "schedule.yaml",
          "cron": "30 5 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 05:30",
          "command": "python3 -m backend.scripts.import_kumamoto_religious_reps --apply",
          "modules": [
            "backend.scripts.import_kumamoto_religious_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T05:30:00+09:00",
              "beijing": "2027-01-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T05:30:00+09:00",
              "beijing": "2027-04-10T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T05:30:00+09:00",
              "beijing": "2027-07-10T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 890,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "env_sanpai",
      "crawler": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "field_lineage",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "field_lineage",
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 104,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO field_lineage\n       (table_name, column_name, source_code, parser_module,\n        parser_function, description, parser_version, last_written_at)\nVALUES\n       ('company_industry_inferred', 'industry_jsic_mid',\n        %(src)s,\n        'backend.scripts.backfill_industry_from_env_sanpai',\n        'main',\n        '産廃情報ネット (環境省) 産業廃棄物処理業者 → JSIC mid=88 (廃棄物処理業). '\n        '通过 business_licenses[license_type=industrial_waste_disposal] join; '\n        'confidence=1.00 (法定許可); idempotent merge into industry_jsic_mid + industry_signals.',\n        'v1',\n        now())\nON CONFLICT (table_name, column_name) DO UPDATE\nSET source_code     = EXCLUDED.source_code,\n    parser_module   = EXCLUDED.parser_module,\n    parser_function = EXCLUDED.parser_function,\n    description     = EXCLUDED.description,\n    parser_version  = EXCLUDED.parser_version,\n    last_written_at = now()\n"
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "環境省 産廃情報ネット",
      "source_url": "https://www.sanpainet.or.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "字段溯源元数据"
    },
    {
      "source": "tosankyo_members",
      "crawler": "backend/scripts/import_tosankyo_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 260,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '一般社団法人 東京都産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public regular-member list exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都産業資源循環協会 正会員名簿",
      "source_url": "https://tosankyo.or.jp/regular_member",
      "crawler_url_candidates": [
        {
          "url": "https://tosankyo.or.jp/regular_member",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "osaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 385,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '大阪府', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Osaka prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o120060/sangyohaiki/gyousyameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "yamanashi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamanashi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 308,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '山梨県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Yamanashi prefecture public industrial-waste licensee PDFs expose representative names, addresses, phone numbers, and permit numbers. This importer parses text-layer PDFs and matches conservatively by expanded legal name, using address to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山梨県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamanashi.jp/kankyo-sb/85248836192.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nta_houjin_api_v1",
      "crawler": "backend/scripts/import_houjin_via_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 546,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_api_daily",
          "enabled": false,
          "line": 419
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号 Web-API v4",
      "source_url": "https://api.houjin-bangou.nta.go.jp/4",
      "crawler_url_candidates": [
        {
          "url": "https://api.houjin-bangou.nta.go.jp/4",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_api_daily",
          "scheduler": "schedule.yaml",
          "cron": "30 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 19:30",
          "command": "python3 -m backend.scripts.import_houjin_via_api --daily --rps 4",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 419,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tyc-nta-daily.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 18:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.import_houjin_via_api --daily --rps 3",
          "modules": [
            "backend.scripts.import_houjin_via_api"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:30:00+00:00",
              "beijing": "2026-11-04T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:30:00+00:00",
              "beijing": "2026-11-05T02:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:30:00+00:00",
              "beijing": "2026-11-06T02:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-nta-daily.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 18:30:00 UTC ; next_elapse=Tue 2026-11-03 18:30:00 UTC }\nNextElapseUSecRealtime=Tue 2026-11-03 18:30:00 UTC\nLastTriggerUSec=Mon 2026-11-02 18:30:01 UTC\nId=tyc-nta-daily.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "aomori_alis_supporter",
      "crawler": "backend/scripts/import_aomori_alis_supporter_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 347,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Aomori Prefectural Education Center', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public school supporter directory. Corporate-number match requires unique postal code, normalized company name, and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県総合社会教育センター 学校教育サポーター",
      "source_url": "https://www.alis.pref.aomori.lg.jp/supporter/",
      "crawler_url_candidates": [
        {
          "url": "https://www.alis.pref.aomori.lg.jp/supporter/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "hirakata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_hirakata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 324,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '枚方市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Hirakata city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "枚方市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.hirakata.osaka.jp/0000004004.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.hirakata.osaka.jp/0000004004.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "fsa_money_lender",
      "crawler": "backend/scripts/import_fsa_money_lender_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_money_lender",
          "enabled": true,
          "line": 770
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 335,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '金融庁 登録貸金業者情報検索サービス',\n            'FSA Registered Money Lender Search Service',\n            'license', '金融庁', %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.2, 'mode', 'official-search-export-html'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.complian"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "金融庁 登録貸金業者情報検索サービス",
      "source_url": "https://clearing.fsa.go.jp/kashikin/index.php",
      "crawler_url_candidates": [
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://clearing.fsa.go.jp/kashikin/index.php",
          "symbol": "source_url",
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 518,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_money_lender",
          "line": 770,
          "module_chain": [
            "backend.scripts.import_fsa_money_lender_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "fsa_money_lender",
          "scheduler": "schedule.yaml",
          "cron": "40 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:40",
          "command": "python3 -m backend.scripts.import_fsa_money_lender_reps --download --apply",
          "modules": [
            "backend.scripts.import_fsa_money_lender_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:40:00+09:00",
              "beijing": "2026-11-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:40:00+09:00",
              "beijing": "2026-12-08T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:40:00+09:00",
              "beijing": "2027-01-08T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 770,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gifu_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_gifu_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 243,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '岐阜県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Gifu prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岐阜県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.gifu.lg.jp/page/3670.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gifu.lg.jp/page/3670.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "pmark_jmra",
      "crawler": "backend/scripts/import_jmra_pmark_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmark_jmra",
          "enabled": true,
          "line": 800
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 220,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'JMRA プライバシーマーク付与適格決定事業者一覧',\n           'JMRA PrivacyMark Decision List', 'certification',\n           'Japan Marketing Research Association', %s, 'public_web', 'P3',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public PrivacyMark decision list. Corporate-number match requires unique postal code plus normalized company name.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "JMRA プライバシーマーク付与適格決定事業者一覧",
      "source_url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.jmra-net.or.jp/activities/pmark/list.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmark_jmra",
          "line": 800,
          "module_chain": [
            "backend.scripts.import_jmra_pmark_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "pmark_jmra",
          "scheduler": "schedule.yaml",
          "cron": "10 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:10",
          "command": "python3 -m backend.scripts.import_jmra_pmark_representatives --apply",
          "modules": [
            "backend.scripts.import_jmra_pmark_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:10:00+09:00",
              "beijing": "2026-11-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:10:00+09:00",
              "beijing": "2026-12-08T08:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:10:00+09:00",
              "beijing": "2027-01-08T08:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 800,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 116,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "takatsuki_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_takatsuki_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 397,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '高槻市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Takatsuki city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "高槻市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.takatsuki.osaka.jp/soshiki/26/2057.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "t2fifa_members",
      "crawler": "backend/scripts/import_t2fifa_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "t2fifa_members",
          "enabled": true,
          "line": 806
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 288,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Type II Financial Instruments Firms Association', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public association member register. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "第二種金融商品取引業協会 正会員名簿",
      "source_url": "https://www.t2fifa.or.jp/members/register/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 177,
          "origin": "online"
        },
        {
          "url": "https://www.t2fifa.or.jp/members/register/",
          "symbol": "source_url",
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 186,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "t2fifa_members",
          "line": 806,
          "module_chain": [
            "backend.scripts.import_t2fifa_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "t2fifa_members",
          "scheduler": "schedule.yaml",
          "cron": "40 9 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 09:40",
          "command": "python3 -m backend.scripts.import_t2fifa_member_representatives --max-pages 80 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_t2fifa_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T09:40:00+09:00",
              "beijing": "2026-11-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T09:40:00+09:00",
              "beijing": "2026-12-08T08:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T09:40:00+09:00",
              "beijing": "2027-01-08T08:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 806,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "maebashi_sanpai_disposal_waste_licensees",
      "crawler": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 269,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '前橋市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Maebashi public industrial-waste disposal licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "前橋市 産業廃棄物処分業者名簿",
      "source_url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.maebashi.gunma.jp/soshiki/kankyo/haikibutsutaisaku/gyomu/5/2440.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nta_houjin",
      "crawler": "backend/scripts/import_houjin_bangou.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nta_houjin_daily",
          "enabled": true,
          "line": 380
        },
        {
          "task": "nta_houjin_monthly",
          "enabled": true,
          "line": 386
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 403,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE data_sources\n           SET crawl_config = jsonb_set(\n               COALESCE(crawl_config, '{}'::jsonb),\n               %s::text[],\n               to_jsonb(%s::text),\n               true),\n               updated_at = now()\n         WHERE code = %s\n        "
        },
        {
          "table": "data_sources",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 797,
          "origin": "online",
          "kind": "sql_write",
          "sql": "Don't update data_sources.crawl_config (useful for fixture replay)."
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "国税庁 法人番号公表サイト",
      "source_url": "https://www.houjin-bangou.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.houjin-bangou.nta.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 66,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/",
          "symbol": "ZENKEN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 67,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/zenken/index.html",
          "symbol": "ZENKEN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 68,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/",
          "symbol": "SABUN_LIST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 69,
          "origin": "online"
        },
        {
          "url": "https://www.houjin-bangou.nta.go.jp/download/sabun/index.html",
          "symbol": "SABUN_POST",
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 70,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nta_houjin_daily",
          "line": 380,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        },
        {
          "task": "nta_houjin_monthly",
          "line": 386,
          "module_chain": [
            "backend.scripts.import_houjin_bangou"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nta_houjin_daily",
          "scheduler": "schedule.yaml",
          "cron": "0 19 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 19:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode daily",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T19:00:00+09:00",
              "beijing": "2026-11-03T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T19:00:00+09:00",
              "beijing": "2026-11-04T18:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T19:00:00+09:00",
              "beijing": "2026-11-05T18:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 380,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nta_houjin_monthly",
          "scheduler": "schedule.yaml",
          "cron": "0 18 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 18:00",
          "command": "python3 -m backend.scripts.import_houjin_bangou --mode monthly",
          "modules": [
            "backend.scripts.import_houjin_bangou"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T18:00:00+09:00",
              "beijing": "2026-11-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T18:00:00+09:00",
              "beijing": "2026-12-05T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T18:00:00+09:00",
              "beijing": "2027-01-05T17:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 386,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "mlit_chintai_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 39,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 賃貸住宅管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/chintaiKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "mlit_mansion_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 48,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 マンション管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/mansionKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "mlit_jutaku_shukuhaku_management",
      "crawler": "backend/scripts/import_mlit_chintai_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 57,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_chintai_management",
          "enabled": true,
          "line": 782
        },
        {
          "task": "mlit_mansion_management",
          "enabled": true,
          "line": 788
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "enabled": true,
          "line": 794
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 382,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license',\n           'Ministry of Land, Infrastructure, Transport and Tourism', %s, 'public_web',\n           'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public TAKKEN browsing system. Corporate-number match requires unique normalized company name plus address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "国土交通省 住宅宿泊管理業者検索",
      "source_url": "https://etsuran2.mlit.go.jp/TAKKEN/jutakuKensaku.do",
      "crawler_url_candidates": [
        {
          "url": "https://etsuran2.mlit.go.jp/TAKKEN/{dynamic}",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 509,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_chintai_management",
          "line": 782,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_mansion_management",
          "line": 788,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "line": 794,
          "module_chain": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "mlit_chintai_management",
          "scheduler": "schedule.yaml",
          "cron": "40 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry chintai --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:40:00+09:00",
              "beijing": "2026-11-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:40:00+09:00",
              "beijing": "2026-12-08T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:40:00+09:00",
              "beijing": "2027-01-08T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 782,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_mansion_management",
          "scheduler": "schedule.yaml",
          "cron": "10 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:10",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry mansion --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:10:00+09:00",
              "beijing": "2026-11-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:10:00+09:00",
              "beijing": "2026-12-08T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:10:00+09:00",
              "beijing": "2027-01-08T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 788,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "mlit_jutaku_shukuhaku_management",
          "scheduler": "schedule.yaml",
          "cron": "40 8 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 08:40",
          "command": "python3 -m backend.scripts.import_mlit_chintai_management_reps --registry jutaku --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_mlit_chintai_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T08:40:00+09:00",
              "beijing": "2026-11-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T08:40:00+09:00",
              "beijing": "2026-12-08T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T08:40:00+09:00",
              "beijing": "2027-01-08T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 794,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "iwate_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_iwate_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 403,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '岩手県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Iwate prefecture public industrial-waste licensee PDFs expose representative names, addresses, and permit numbers. This importer parses text-layer PDF word coordinates and matches conservatively by expanded legal name, using address to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "岩手県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.iwate.jp/kurashikankyou/kankyou/sanpai/1022805.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "niigata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_niigata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 254,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '新潟県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Niigata prefecture public industrial-waste licensee Excels expose representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "新潟県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.niigata.lg.jp/sec/shigenjunkan/1356778403222.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/fetch_edinet_shareholders.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 72,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_shareholders",
          "enabled": true,
          "line": 318
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 68,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_shareholders",
          "line": 318,
          "module_chain": [
            "backend.scripts.fetch_edinet_shareholders"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "edinet_shareholders",
          "scheduler": "schedule.yaml",
          "cron": "0 9 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 09:00",
          "command": "python3 -m backend.scripts.fetch_edinet_shareholders",
          "modules": [
            "backend.scripts.fetch_edinet_shareholders"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:00:00+09:00",
              "beijing": "2026-11-04T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T09:00:00+09:00",
              "beijing": "2026-11-11T08:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T09:00:00+09:00",
              "beijing": "2026-11-18T08:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 318,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 1,
          "kind": "reviewed_input_provenance",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 146,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        UPDATE raw_documents\n           SET parsed=TRUE, parsed_at=now(), parser_version=%s\n         WHERE id=%s AND fetched_at=%s\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "aomori_sanpai_association_members",
      "crawler": "backend/scripts/import_aomori_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 219,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '一般社団法人 青森県産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public member list exposes representative titles/names, addresses, phone and fax. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "青森県産業資源循環協会 協会員名簿",
      "source_url": "http://www.aosanpaikyou.or.jp/member-list",
      "crawler_url_candidates": [
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "http://www.aosanpaikyou.or.jp/member-list",
          "symbol": "source_url",
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 301,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "soumu_registered_telecom",
      "crawler": "backend/scripts/import_soumu_registered_telecom_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 33,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "soumu_registered_telecom",
          "enabled": true,
          "line": 776
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 222,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '総務省', %s, 'CC-BY', 'P2',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Official MIC/Soumu XLS for operators registered under Telecommunications Business Act Article 9. Includes corporate number and representative.',\n             'source_url', %s::text,\n             'data_portal_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "総務省 登録電気通信事業者一覧",
      "source_url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
      "crawler_url_candidates": [
        {
          "url": "https://www.soumu.go.jp/johotsusintokei/field/data/gt010402.xls",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "soumu_registered_telecom",
          "line": 776,
          "module_chain": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "soumu_registered_telecom",
          "scheduler": "schedule.yaml",
          "cron": "10 7 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 07:10",
          "command": "python3 -m backend.scripts.import_soumu_registered_telecom_reps --apply",
          "modules": [
            "backend.scripts.import_soumu_registered_telecom_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T07:10:00+09:00",
              "beijing": "2026-11-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T07:10:00+09:00",
              "beijing": "2026-12-08T06:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T07:10:00+09:00",
              "beijing": "2027-01-08T06:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 776,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kanpo_downstream_links",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kanpo_downstream_links",
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 219,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kanpo_downstream_links (\n            notice_id, source_record_id, target_table, target_id,\n            target_partition_date, derivation_type, parser_version, inputs\n        ) VALUES (\n            %s, %s, 'risk_events', %s,\n            %s, 'risk_event_upsert', %s, %s\n        )\n        ON CONFLICT (notice_id, target_table, target_id, target_partition_date)\n        DO UPDATE SET\n            source_record_id = COALESCE(EXCLUDED.source_record_id, kanpo_downstream_links.source_record_id),\n            parser_version = EXCLUDED.parser_version,\n            inputs = kanpo_downstream_links.inputs || EXCLUDED.inputs\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "官报派生结果关联"
    },
    {
      "source": "kanpo_official",
      "crawler": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 259,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "官報発行サイト",
      "source_url": "https://www.kanpo.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "chiba_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_chiba_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 227,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '千葉県', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Chiba prefecture public industrial-waste licensee PDFs expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'pdf_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "千葉県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.chiba.lg.jp/haishi/shorigyou/meibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "osaka_city_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_osaka_city_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '大阪市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Osaka City public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb,\n             'license', 'CC-BY-4.0'\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/page/0000009245.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.city.osaka.lg.jp/kankyo/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jsda_members",
      "crawler": "backend/scripts/import_jsda_member_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jsda_members",
          "enabled": true,
          "line": 812
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 345,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Japan Securities Dealers Association', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public JSDA member lists. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "日本証券業協会 会員名簿",
      "source_url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/kyoukaiin/kyoukaiin/meibo/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jsda_members",
          "line": 812,
          "module_chain": [
            "backend.scripts.import_jsda_member_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jsda_members",
          "scheduler": "schedule.yaml",
          "cron": "10 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:10",
          "command": "python3 -m backend.scripts.import_jsda_member_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_jsda_member_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:10:00+09:00",
              "beijing": "2026-11-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:10:00+09:00",
              "beijing": "2026-12-08T09:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:10:00+09:00",
              "beijing": "2027-01-08T09:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 812,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "yamagata_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_yamagata_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 328,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '山形県', %s,\n           'public_excel_zip', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Yamagata prefecture public industrial-waste licensee Excel ZIP exposes representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'zip_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "山形県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.yamagata.jp/050010/kurashi/kankyo/haikibutsu/meibo/meibo-all.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "imaj_advice_disclosure",
      "crawler": "backend/scripts/import_imaj_advice_disclosure_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_advice_disclosure",
          "enabled": true,
          "line": 818
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 322,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Asset Management Association of Japan', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public investment-advice member disclosure PDFs. Corporate-number match requires unique normalized member name plus postal code and address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資助言・代理会員台帳",
      "source_url": "https://www.imaj.or.jp/members/disclosure/advice/",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/advice/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_advice_disclosure",
          "line": 818,
          "module_chain": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_advice_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "40 10 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 10:40",
          "command": "python3 -m backend.scripts.import_imaj_advice_disclosure_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_advice_disclosure_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T10:40:00+09:00",
              "beijing": "2026-11-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T10:40:00+09:00",
              "beijing": "2026-12-08T09:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T10:40:00+09:00",
              "beijing": "2027-01-08T09:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 818,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3,
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_html_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_html_done",
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 81,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "INSERT INTO gbizinfo_html_done (corporate_number, http_status, has_url) VALUES (%s, %s, %s) ON CONFLICT (corporate_number) DO UPDATE SET http_status=EXCLUDED.http_status, has_url=EXCLUDED.has_url, fetched_at=now()"
        }
      ],
      "dimensions": [
        3,
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/refetch_missing_gbizinfo_html.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 237,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        3,
        5
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet",
      "crawler": "backend/scripts/backfill_establishment_from_edinet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 346,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        7
      ],
      "source_name": "EDINET",
      "source_url": "https://disclosure2.edinet-fsa.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "enabled_direct",
      "program_kind": "backfill",
      "schedule_plans": [
        {
          "task": "tyc-establishment-edinet.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 04:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.backfill_establishment_from_edinet --incremental",
          "modules": [
            "backend.scripts.backfill_establishment_from_edinet"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+00:00",
              "beijing": "2026-11-04T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+00:00",
              "beijing": "2026-11-05T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+00:00",
              "beijing": "2026-11-06T12:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-establishment-edinet.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 04:30:00 UTC ; next_elapse=Wed 2026-11-04 04:30:00 UTC }\nNextElapseUSecRealtime=Wed 2026-11-04 04:30:00 UTC\nLastTriggerUSec=Tue 2026-11-03 04:30:01 UTC\nId=tyc-establishment-edinet.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "toyama_sanpai_association_members",
      "crawler": "backend/scripts/import_toyama_sanpai_association_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 233,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'industry_association', '公益社団法人 富山県産業資源循環協会', %s,\n           'public_html', 'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public disposal-company list exposes representative names, addresses, phone numbers, and permit flags. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県産業資源循環協会 処理業許可業者名簿",
      "source_url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
      "crawler_url_candidates": [
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://toyama-sanpai.ecnet.jp/disposal_comp/",
          "symbol": "source_url",
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "toyama_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyama_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 252,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '富山県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Toyama prefecture public industrial-waste licensee Excel exposes representative role/name and head-office address in four-row blocks. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "富山県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.toyama.jp/1705/kurashi/kankyoushizen/haikibutsu/kj00007418/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "fukui_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_fukui_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 254,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '福井県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Fukui prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福井県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukui.lg.jp/doc/junkan/meibotop.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "aichi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_aichi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 317,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n            priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '愛知県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Aichi prefecture public industrial-waste licensee Excel exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛知県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.aichi.jp/site/kankyo/sigen-ka-gyousya.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "enecho_retail_gas",
      "crawler": "backend/scripts/import_enecho_retail_gas_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_gas",
          "enabled": true,
          "line": 752
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 162,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '資源エネルギー庁 登録ガス小売事業者一覧',\n            'ANRE Registered Retail Gas Suppliers', 'license', '資源エネルギー庁',\n            %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.1, 'mode', 'manual-cache-or-low-rate'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.compliance"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録ガス小売事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/gas/liberalization/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 33,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_gas",
          "line": 752,
          "module_chain": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_gas",
          "scheduler": "schedule.yaml",
          "cron": "20 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:20",
          "command": "python3 -m backend.scripts.import_enecho_retail_gas_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_gas_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:20:00+09:00",
              "beijing": "2026-11-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:20:00+09:00",
              "beijing": "2026-12-08T04:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:20:00+09:00",
              "beijing": "2027-01-08T04:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 752,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 203,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active)\n        VALUES (%s, %s, %s, 'license_registry', '厚生労働省', %s,\n                'public_domain', 'P1', TRUE)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          category=EXCLUDED.category,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kaigo_service_public_detail",
      "crawler": "backend/scripts/import_kaigo_service_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "kaigo_service_rep_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "kaigo_service_rep_done",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 418,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO kaigo_service_rep_done\n          (corporate_number, status, company_name, company_kind, facility_code,\n           service_code, facility_name, service_type, raw_name, display_name,\n           position, source_url, error_message, updated_at)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          status=EXCLUDED.status,\n          company_name=EXCLUDED.company_name,\n          company_kind=EXCLUDED.company_kind,\n          facility_code=EXCLUDED.facility_code,\n          service_code=EXCLUDED.service_code,\n          facility_name=EXCLUDED.facility_name,\n          service_type=EXCLUDED.service_type,\n          raw_name=EXCLUDED.raw_name,\n          display_name=EXCLUDED.display_name,\n          position=EXCLUDED.position,\n          source_url=EXCLUDED.source_url,\n          error_message=EXCLUDED.error_message,\n          updated_at=now()\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "介護サービス情報公表システム 事業所詳細",
      "source_url": "https://www.kaigokensaku.mhlw.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.kaigokensaku.mhlw.go.jp/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 396,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "osaka_medical_corporation_reports",
      "crawler": "backend/scripts/import_osaka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 790,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '大阪府', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "大阪府医療法人事業報告書等",
      "source_url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.osaka.lg.jp/o100020/iryo/hojin/kessan_etsuran.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "toyonaka_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_toyonaka_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 329,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '豊中市', %s,\n           'public_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Toyonaka city public industrial-waste licensee PDFs expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "豊中市 産業廃棄物処理業者一覧",
      "source_url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.toyonaka.osaka.jp/kurashi/gomi_risaikuru_bika/sangyohaikibutsu/gyousya/syorigyosyakensaku.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "ishikawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ishikawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 249,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '石川県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ishikawa prefecture public industrial-waste licensee Excels expose representative role/name and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "石川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ishikawa.lg.jp/haitai/gyoshameibo/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "sme_ma_support_institution",
      "crawler": "backend/scripts/import_sme_ma_support_institution_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 261,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '中小企業庁', %s, 'public_web', 'P2',\n           true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public M&A support institution registry detail cards expose corporate number and representative name for corporate registrants.',\n             'source_url', %s::text,\n             'livewire_endpoint', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "中小企業庁 M&A支援機関登録制度 登録支援機関データベース",
      "source_url": "https://ma-shienkikan.go.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/livewire/message/frontend.published-card",
          "symbol": "LIVEWIRE_ENDPOINT",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ma-shienkikan.go.jp/search",
          "symbol": "source_url",
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 380,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "molink_company_profiles",
      "crawler": "backend/scripts/import_molink_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "molink_company_profiles",
          "enabled": true,
          "line": 848
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 256,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '一般社団法人 全国木材組合連合会 木材SCM支援システム もりんく', %s, 'public_html',\n           62, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "木材SCM支援システム もりんく 事業者詳細",
      "source_url": "https://molink.jp/search",
      "crawler_url_candidates": [
        {
          "url": "https://molink.jp/search",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "BASE_PROFILE_URL",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://molink.jp/company/{company_id}",
          "symbol": "profile_url_template",
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 280,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "molink_company_profiles",
          "line": 848,
          "module_chain": [
            "backend.scripts.import_molink_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "molink_company_profiles",
          "scheduler": "schedule.yaml",
          "cron": "30 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:30",
          "command": "python3 -m backend.scripts.import_molink_representatives --start-id 1 --end-id 3000 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_molink_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:30:00+09:00",
              "beijing": "2026-11-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:30:00+09:00",
              "beijing": "2026-12-09T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:30:00+09:00",
              "beijing": "2027-01-09T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 848,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kanagawa_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_kanagawa_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 229,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '神奈川県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kanagawa prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "神奈川県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kanagawa.jp/docs/p3k/cnt/f5654/index.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 62,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 116,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "batch_or_parser",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 255,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active)\n        VALUES (%s, %s, %s, 'license_registry', '厚生労働省 / 独立行政法人福祉医療機構', %s,\n                'public_registry', 'P1', TRUE)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          category=EXCLUDED.category,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "wam_disability_public_detail",
      "crawler": "backend/scripts/import_wam_disability_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "wam_disability_rep_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "wam_disability_rep_done",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 472,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO wam_disability_rep_done\n          (corporate_number, status, company_name, company_kind, facility_code,\n           service_code, facility_name, service_type, system_no, raw_name,\n           display_name, position, source_url, error_message, updated_at)\n        VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          status=EXCLUDED.status,\n          company_name=EXCLUDED.company_name,\n          company_kind=EXCLUDED.company_kind,\n          facility_code=EXCLUDED.facility_code,\n          service_code=EXCLUDED.service_code,\n          facility_name=EXCLUDED.facility_name,\n          service_type=EXCLUDED.service_type,\n          system_no=EXCLUDED.system_no,\n          raw_name=EXCLUDED.raw_name,\n          display_name=EXCLUDED.display_name,\n          position=EXCLUDED.position,\n          source_url=EXCLUDED.source_url,\n          error_message=EXCLUDED.error_message,\n          updated_at=now()\n "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM 障害福祉サービス等情報公表システム 事業所詳細",
      "source_url": "https://www.wam.go.jp/sfkohyoout/",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E0000.do",
          "symbol": "HOME_URL",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "SEARCH_ENDPOINT",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 447,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/sfkohyoout/COP000100E12.do",
          "symbol": "request_endpoint",
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 450,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "gunma_medical_corporation_reports",
      "crawler": "backend/scripts/import_gunma_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gunma_medical_corporation_reports",
          "enabled": true,
          "line": 902
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 476,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '群馬県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "群馬県医療法人事業報告書等",
      "source_url": "https://www.pref.gunma.jp/page/716575.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.gunma.jp/page/716575.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 48,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gunma_medical_corporation_reports",
          "line": 902,
          "module_chain": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "gunma_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "30 6 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 06:30",
          "command": "python3 -m backend.scripts.import_gunma_medical_corporation_reps --max-zips 6 --max-pdfs 600 --ocr-missing --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_gunma_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T06:30:00+09:00",
              "beijing": "2027-01-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T06:30:00+09:00",
              "beijing": "2027-04-10T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T06:30:00+09:00",
              "beijing": "2027-07-10T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 902,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "wam_social_welfare_current_report",
      "crawler": "backend/scripts/import_wam_social_welfare_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "wam_social_welfare_current_report",
          "enabled": true,
          "line": 854
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 287,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'disclosure',\n           '独立行政法人福祉医療機構 / 社会福祉法人の財務諸表等電子開示システム',\n           %s, 'public_html_pdf', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public WAM NET corporation detail pages and current-status reports. Representative is extracted from the director table role code 1 理事長.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "WAM NET 社会福祉法人 現況報告書",
      "source_url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "TOP_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0216000E01.do",
          "symbol": "CORP_NO_SEARCH_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/wamnet/zaihyoukaiji/pub/PUB0200000E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 365,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "wam_social_welfare_current_report",
          "line": 854,
          "module_chain": [
            "backend.scripts.import_wam_social_welfare_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "wam_social_welfare_current_report",
          "scheduler": "schedule.yaml",
          "cron": "0 7 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 07:00",
          "command": "python3 -m backend.scripts.import_wam_social_welfare_reps --limit 10000 --sleep 0.2 --apply",
          "modules": [
            "backend.scripts.import_wam_social_welfare_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T07:00:00+09:00",
              "beijing": "2026-12-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T07:00:00+09:00",
              "beijing": "2027-01-09T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 854,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nexco_east_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_east_qualified_suppliers",
          "enabled": true,
          "line": 866
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 289,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '東日本高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'NEXCO East public qualified-supplier list exposes representative titles and names; importer only inserts unique local matches by company name and postal code.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO東日本 有資格者情報検索",
      "source_url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
      "crawler_url_candidates": [
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.e-nexco.co.jp/bids/quarification/search_service",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 372,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_east_qualified_suppliers",
          "line": 866,
          "module_chain": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "line": 878,
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_east_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:30",
          "command": "python3 -m backend.scripts.import_nexco_east_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:30:00+09:00",
              "beijing": "2026-11-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:30:00+09:00",
              "beijing": "2026-12-09T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:30:00+09:00",
              "beijing": "2027-01-09T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 866,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        },
        {
          "task": "hanshin_expressway_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "30 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:30",
          "command": "python3 -m backend.scripts.import_hanshin_expressway_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:30:00+09:00",
              "beijing": "2026-11-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:30:00+09:00",
              "beijing": "2026-12-09T11:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:30:00+09:00",
              "beijing": "2027-01-09T11:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 878,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.import_hanshin_expressway_qualified_supplier_reps",
            "backend.scripts.import_nexco_east_qualified_supplier_reps"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "fukuoka_medical_corporation_reports",
      "crawler": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 519,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '福岡県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "福岡県医療法人事業報告書等",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/iryouhoujin-fukuoka-iryoshido.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nexco_west_qualified_suppliers",
      "crawler": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 43,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nexco_west_qualified_suppliers",
          "enabled": true,
          "line": 872
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 242,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '西日本高速道路株式会社', %s,\n           'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'NEXCO West public qualified-supplier Excel files expose representative names; importer only inserts unique local matches by company name and address.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "NEXCO西日本 有資格者名簿",
      "source_url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
      "crawler_url_candidates": [
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://corp.w-nexco.co.jp/procurement/contest/licensee/",
          "symbol": "source_url",
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 325,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nexco_west_qualified_suppliers",
          "line": 872,
          "module_chain": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "nexco_west_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 12 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 12:00",
          "command": "python3 -m backend.scripts.import_nexco_west_qualified_supplier_reps --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_nexco_west_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T12:00:00+09:00",
              "beijing": "2026-11-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T12:00:00+09:00",
              "beijing": "2026-12-09T11:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T12:00:00+09:00",
              "beijing": "2027-01-09T11:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 872,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "tochigi_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tochigi_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 322,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '栃木県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Tochigi prefecture public industrial-waste licensee Excels expose representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "栃木県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.tochigi.lg.jp/d05/eco/haikibutsu/haikibutsu/1266569928455.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "company_location_profile",
      "crawler": "backend/scripts/derive_company_location_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_location_profile",
          "enabled": true,
          "line": 305
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地・不動産環境プロファイル",
      "source_url": null,
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_location_profile",
          "line": 305,
          "module_chain": [
            "backend.scripts.derive_company_location_profiles"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "derived",
      "schedule_plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "gbizinfo_html",
      "crawler": "backend/scripts/run_gbizinfo_html_batch.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 64,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "gbizinfo_html",
          "enabled": true,
          "line": 616
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 142,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            UPDATE crawl_jobs\n               SET records_fetched=%s,\n                   records_new=%s,\n                   records_updated=%s,\n                   metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n            "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "gBizINFO 法人プロフィール HTML",
      "source_url": "https://info.gbiz.go.jp/hojin/ichiran",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "gbizinfo_html",
          "line": 616,
          "module_chain": [
            "backend.scripts.run_gbizinfo_html_batch"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "gbizinfo_html",
          "scheduler": "schedule.yaml",
          "cron": "0 */6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每 6 小时，00:00、06:00、12:00、18:00",
          "command": "python3 -m backend.scripts.run_gbizinfo_html_batch",
          "modules": [
            "backend.scripts.run_gbizinfo_html_batch"
          ],
          "selected_sources": [],
          "timeout_min_configured": 360,
          "max_instances_configured": 1,
          "strategy": "continuous",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:00:00+09:00",
              "beijing": "2026-11-03T17:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:00:00+09:00",
              "beijing": "2026-11-03T23:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 616,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "isico_dgnet",
      "crawler": "backend/scripts/import_isico_dgnet_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isico_dgnet",
          "enabled": true,
          "line": 830
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 287,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'ISICO DGnet 企業情報',\n           'ISICO DGnet Company Directory', 'directory',\n           'Ishikawa Sunrise Industries Creation Organization', %s, 'public_web',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public DGnet company directory. Corporate-number match requires unique postal code plus normalized company name.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ISICO DGnet 企業情報",
      "source_url": "https://www.isico.or.jp/company/",
      "crawler_url_candidates": [
        {
          "url": "https://www.isico.or.jp",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.isico.or.jp/company/",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isico_dgnet",
          "line": 830,
          "module_chain": [
            "backend.scripts.import_isico_dgnet_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "isico_dgnet",
          "scheduler": "schedule.yaml",
          "cron": "0 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:00",
          "command": "python3 -m backend.scripts.import_isico_dgnet_representatives --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_isico_dgnet_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:00:00+09:00",
              "beijing": "2026-11-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:00:00+09:00",
              "beijing": "2026-12-09T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:00:00+09:00",
              "beijing": "2027-01-09T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 830,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "sakai_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_sakai_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 302,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '堺市', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Sakai city public industrial-waste licensee Excels expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "堺市 産業廃棄物処理業者名簿",
      "source_url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.city.sakai.lg.jp/kurashi/gomi/gomi_recy/jigyosho/sangyohaikibutsu/haikibutsushori/gyoshameibo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "moj_registered_support_org",
      "crawler": "backend/scripts/import_moj_registered_support_org_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 36,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_registered_support_org",
          "enabled": true,
          "line": 764
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 281,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '出入国在留管理庁 登録支援機関登録簿',\n            'Immigration Services Agency Registered Support Organization List',\n            'license', '出入国在留管理庁', %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.2, 'mode', 'official-excel-download'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_recor"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "出入国在留管理庁 登録支援機関登録簿",
      "source_url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.moj.go.jp/isa/applications/ssw/nyuukokukanri07_00205.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 463,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_registered_support_org",
          "line": 764,
          "module_chain": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "moj_registered_support_org",
          "scheduler": "schedule.yaml",
          "cron": "10 6 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 06:10",
          "command": "python3 -m backend.scripts.import_moj_registered_support_org_reps --download --apply",
          "modules": [
            "backend.scripts.import_moj_registered_support_org_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T06:10:00+09:00",
              "beijing": "2026-11-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T06:10:00+09:00",
              "beijing": "2026-12-08T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T06:10:00+09:00",
              "beijing": "2027-01-08T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 764,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "saitama_medical_corporation_reports",
      "crawler": "backend/scripts/import_saitama_medical_corporation_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "saitama_medical_corporation_reports",
          "enabled": true,
          "line": 908
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 498,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'official_report', '埼玉県', %s, 'public_official_documents',\n           65, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "埼玉県医療法人決算届",
      "source_url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "saitama_medical_corporation_reports",
          "line": 908,
          "module_chain": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "saitama_medical_corporation_reports",
          "scheduler": "schedule.yaml",
          "cron": "0 7 10 1,4,7,10 *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "quarterly",
          "label": "每年 1、4、7、10 月 10 日 07:00",
          "command": "python3 -m backend.scripts.import_saitama_medical_corporation_reps --max-zips 30 --max-pdfs 600 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_saitama_medical_corporation_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2027-01-10T07:00:00+09:00",
              "beijing": "2027-01-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-04-10T07:00:00+09:00",
              "beijing": "2027-04-10T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-07-10T07:00:00+09:00",
              "beijing": "2027-07-10T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 908,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "quarterly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "tokyo_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_tokyo_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 46,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 354,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '東京都', %s,\n           'public_web_search', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Tokyo public industrial-waste licensee search exposes representative names, permit address, postal code, and permit numbers. Corporate-number match requires unique expanded legal name, with postal code/address used to disambiguate.',\n             'source_url', %s::text,\n             'license_types', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "東京都 産業廃棄物処理業者情報検索",
      "source_url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
      "crawler_url_candidates": [
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_itiran.aspx",
          "symbol": "LIST_URL",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.kankyo-sanpai.metro.tokyo.lg.jp/sanpaisearch/search_input.aspx",
          "symbol": "source_url",
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 442,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kokodesearch_childcare_facility_csv",
      "crawler": "backend/scripts/import_kokodesearch_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 42,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "enabled": true,
          "line": 842
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 392,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           '独立行政法人福祉医療機構 / 子ども・子育て支援情報公表システム', %s, 'public_csv',\n           63, true, %s, %s)\n        ON CONFLICT (code) DO UPDATE SET\n          name_ja=EXCLUDED.name_ja,\n          name_en=EXCLUDED.name_en,\n          authority=EXCLUDED.authority,\n          base_url=EXCLUDED.base_url,\n          license_type=EXCLUDED.license_type,\n          priority=EXCLUDED.priority,\n          crawl_config=EXCLUDED.crawl_config,\n          compliance_record=EXCLUDED.compliance_record,\n          is_active=true\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV",
      "source_url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
      "crawler_url_candidates": [
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 45,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E00.do",
          "symbol": "CSV_PAGE_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 46,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010104E06.do",
          "symbol": "CSV_DOWNLOAD_URL",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.wam.go.jp/kokodesearch/ANN010100E00.do",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 599,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "line": 842,
          "module_chain": [
            "backend.scripts.import_kokodesearch_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "kokodesearch_childcare_facility_csv",
          "scheduler": "schedule.yaml",
          "cron": "0 6 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 06:00",
          "command": "python3 -m backend.scripts.import_kokodesearch_representatives --apply",
          "modules": [
            "backend.scripts.import_kokodesearch_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T06:00:00+09:00",
              "beijing": "2026-11-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T06:00:00+09:00",
              "beijing": "2026-12-09T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T06:00:00+09:00",
              "beijing": "2027-01-09T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 842,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "imaj_investment_management_disclosure",
      "crawler": "backend/scripts/import_imaj_investment_management_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "imaj_investment_management_disclosure",
          "enabled": true,
          "line": 824
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 181,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Asset Management Association of Japan', %s, 'public_pdf',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public investment-management company disclosure PDFs. Corporate-number match requires unique normalized company name plus postal code and address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資産運用業協会 投資運用会社要覧",
      "source_url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/pdf-cms/",
          "symbol": "PDF_BASE_URL",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.imaj.or.jp/members/disclosure/investment_management/index.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 263,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "imaj_investment_management_disclosure",
          "line": 824,
          "module_chain": [
            "backend.scripts.import_imaj_investment_management_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "imaj_investment_management_disclosure",
          "scheduler": "schedule.yaml",
          "cron": "10 11 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 11:10",
          "command": "python3 -m backend.scripts.import_imaj_investment_management_reps --download --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_imaj_investment_management_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T11:10:00+09:00",
              "beijing": "2026-11-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T11:10:00+09:00",
              "beijing": "2026-12-08T10:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T11:10:00+09:00",
              "beijing": "2027-01-08T10:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 824,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "kagoshima_sanpai_excellent_waste_licensees",
      "crawler": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 205,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '鹿児島県', %s,\n           'public_html', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Kagoshima prefecture public excellent industrial-waste licensee HTML table exposes representative names and addresses. Corporate-number match requires unique expanded legal name, with address used to disambiguate.',\n             'source_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "鹿児島県 優良産廃処理業者認定基準適合処理業者一覧",
      "source_url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://www.pref.kagoshima.jp/ad03/kurashi-kankyo/recycle/sanpai/yuuryouseinintei.html",
          "symbol": "source_url",
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 328,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/scripts/backfill_representative.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 337,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "gbizinfo_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "gbizinfo_representative_done",
          "file": "backend/scripts/backfill_representative.py",
          "line": 301,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO gbizinfo_representative_done\n          (corporate_number, http_status, has_representative, parsed, error,\n           fetched_at, updated_at)\n        VALUES (%s, %s, %s, %s, %s, now(), now())\n        ON CONFLICT (corporate_number) DO UPDATE SET\n          http_status = EXCLUDED.http_status,\n          has_representative = EXCLUDED.has_representative,\n          parsed = EXCLUDED.parsed,\n          error = EXCLUDED.error,\n          updated_at = now()\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/v1/hojin/{corp}",
          "symbol": "GBIZ_API",
          "file": "backend/scripts/backfill_representative.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "ur_qualified_suppliers",
      "crawler": "backend/scripts/import_ur_qualified_supplier_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ur_qualified_suppliers",
          "enabled": true,
          "line": 860
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 206,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, %s, %s, 'supplier_registry', '独立行政法人都市再生機構',\n            %s, 'public_web', 'P2', true,\n            jsonb_build_object('rps', 0.5, 'mode', 'public-pdf-sweep'),\n            jsonb_build_object(\n                'source_url', %s::text,\n                'note', 'UR publishes qualified supplier PDFs with corporate numbers and representative names.'\n            )\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=true,\n            crawl_config=EXCLUDED.crawl_config,\n     "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "UR都市機構 有資格者名簿",
      "source_url": "https://www.ur-net.go.jp/order/procedure.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.ur-net.go.jp/order/procedure.html",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 299,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ur_qualified_suppliers",
          "line": 860,
          "module_chain": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "ur_qualified_suppliers",
          "scheduler": "schedule.yaml",
          "cron": "0 11 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 11:00",
          "command": "python3 -m backend.scripts.import_ur_qualified_supplier_reps --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_ur_qualified_supplier_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T11:00:00+09:00",
              "beijing": "2026-11-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T11:00:00+09:00",
              "beijing": "2026-12-09T10:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T11:00:00+09:00",
              "beijing": "2027-01-09T10:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 860,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "meti_alcohol",
      "crawler": "backend/scripts/import_meti_alcohol_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_alcohol",
          "enabled": true,
          "line": 758
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 234,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url,\n            license_type, priority, is_active, crawl_config, compliance_record\n        )\n        VALUES (\n            %s, '経済産業省 アルコール事業者名簿',\n            'METI Alcohol Business Operator Lists', 'license', '経済産業省',\n            %s, 'public_open', 'P1', true,\n            jsonb_build_object('rps', 0.5, 'mode', 'manual-cache-or-low-rate'),\n            jsonb_build_object('source_page_confirmed_at', '2026-05-30')\n        )\n        ON CONFLICT (code) DO UPDATE SET\n            name_ja=EXCLUDED.name_ja,\n            name_en=EXCLUDED.name_en,\n            category=EXCLUDED.category,\n            authority=EXCLUDED.authority,\n            base_url=EXCLUDED.base_url,\n            license_type=EXCLUDED.license_type,\n            priority=EXCLUDED.priority,\n            is_active=EXCLUDED.is_active,\n            crawl_config=EXCLUDED.crawl_config,\n            compliance_record=data_sources.compliance_record"
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "経済産業省 アルコール事業者名簿",
      "source_url": "https://www.meti.go.jp/policy/alcohol/openlist/",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/policy/alcohol/openlist/",
          "symbol": "base_url",
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 159,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_alcohol",
          "line": 758,
          "module_chain": [
            "backend.scripts.import_meti_alcohol_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "meti_alcohol",
          "scheduler": "schedule.yaml",
          "cron": "40 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:40",
          "command": "python3 -m backend.scripts.import_meti_alcohol_reps --download --apply",
          "modules": [
            "backend.scripts.import_meti_alcohol_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:40:00+09:00",
              "beijing": "2026-11-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:40:00+09:00",
              "beijing": "2026-12-08T04:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:40:00+09:00",
              "beijing": "2027-01-08T04:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 758,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "enecho_retail_electric",
      "crawler": "backend/scripts/import_enecho_retail_electric_reps.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "enecho_retail_electric",
          "enabled": true,
          "line": 740
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 222,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url,\n           license_type, priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, '資源エネルギー庁 登録小売電気事業者一覧',\n           'ANRE Registered Retail Electricity Suppliers', 'license',\n           '資源エネルギー庁', %s, 'public_open', 'P1', true,\n           jsonb_build_object('rps', 0.1, 'mode', 'manual-cache-or-low-rate'),\n           jsonb_build_object('source_page_confirmed_at', '2026-05-30'))\n        ON CONFLICT (code) DO UPDATE SET\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "資源エネルギー庁 登録小売電気事業者一覧",
      "source_url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
      "crawler_url_candidates": [
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.enecho.meti.go.jp/category/electricity_and_gas/electric/summary/retailers_list/list.xlsx",
          "symbol": "XLSX_URL",
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 41,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "enecho_retail_electric",
          "line": 740,
          "module_chain": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "enecho_retail_electric",
          "scheduler": "schedule.yaml",
          "cron": "0 5 8 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 8 日 05:00",
          "command": "python3 -m backend.scripts.import_enecho_retail_electric_reps --download --apply",
          "modules": [
            "backend.scripts.import_enecho_retail_electric_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-08T05:00:00+09:00",
              "beijing": "2026-11-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-08T05:00:00+09:00",
              "beijing": "2026-12-08T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-08T05:00:00+09:00",
              "beijing": "2027-01-08T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 740,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "nagano_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_nagano_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 249,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '長野県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Nagano prefecture public industrial-waste licensee Excels expose corporate number, representative name, head-office address, and permit data. This importer matches by corporate number and only reads the all-prefecture sheet to avoid jurisdiction duplicates.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "長野県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.nagano.lg.jp/haikibut/kurashi/recycling/haikibutsu/mebo.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "company_geocode_attempts",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "company_geocode_attempts",
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 194,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO company_geocode_attempts (\n                corporate_number, address_hash, query_address, status,\n                attempts, last_attempted_at, next_retry_at, error_message\n            ) VALUES (\n                %s, %s, %s, %s, 1, now(), "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "地理编码尝试／重试状态"
    },
    {
      "source": "company_geocode",
      "crawler": "backend/scripts/geocode_companies_parallel.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "company_geocode",
          "enabled": true,
          "line": 299
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "企業所在地ジオコーディング",
      "source_url": "https://msearch.gsi.go.jp/address-search/AddressSearch",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "company_geocode",
          "line": 299,
          "module_chain": [
            "backend.scripts.geocode_companies_parallel"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "company_geocode",
          "scheduler": "schedule.yaml",
          "cron": "45 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 45 分",
          "command": "python3 -m backend.scripts.geocode_companies_parallel --batch-size 1000 --max-batches 10 --workers 32 --job-type scheduled",
          "modules": [
            "backend.scripts.geocode_companies_parallel"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:45:00+09:00",
              "beijing": "2026-11-03T16:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:45:00+09:00",
              "beijing": "2026-11-03T17:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:45:00+09:00",
              "beijing": "2026-11-03T18:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 299,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ehime_sanpai_waste_licensees",
      "crawler": "backend/scripts/import_ehime_sanpai_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 246,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'license_registry', '愛媛県', %s,\n           'public_excel', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Ehime prefecture public industrial-waste licensee Excels expose representative names and office addresses. Corporate-number match requires unique expanded legal name, with office address used to disambiguate.',\n             'source_url', %s::text,\n             'file_urls', %s::jsonb\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "愛媛県 産業廃棄物処理業者名簿",
      "source_url": "https://www.pref.ehime.jp/page/9773.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.ehime.jp/page/9773.html",
          "symbol": "SOURCE_URL",
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "importer",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 196,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_actions",
          "enabled": true,
          "line": 103
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 排除措置・課徴金",
      "source_url": "https://www.jftc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jftc.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/houdou/pressrelease/dksochi/{year}/index.html",
          "symbol": "INDEX_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/dk/ichiran/dkhaijo_{year}.html",
          "symbol": "ICHIRAN_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_actions",
          "line": 103,
          "module_chain": [
            "backend.crawlers.sources.jftc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jftc_actions",
      "crawler": "backend/crawlers/sources/jftc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 196,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_actions",
          "enabled": true,
          "line": 103
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 排除措置・課徴金",
      "source_url": "https://www.jftc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jftc.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/houdou/pressrelease/dksochi/{year}/index.html",
          "symbol": "INDEX_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.jftc.go.jp/dk/ichiran/dkhaijo_{year}.html",
          "symbol": "ICHIRAN_PATTERN",
          "file": "backend/crawlers/sources/jftc.py",
          "line": 55,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_actions",
          "line": 103,
          "module_chain": [
            "backend.crawlers.sources.jftc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_actions",
          "scheduler": "schedule.yaml",
          "cron": "10 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:10",
          "command": "python3 -m backend.crawlers.sources.jftc",
          "modules": [
            "backend.crawlers.sources.jftc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:10:00+09:00",
              "beijing": "2026-11-04T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:10:00+09:00",
              "beijing": "2026-11-05T05:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:10:00+09:00",
              "beijing": "2026-11-06T05:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 103,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "edinet_officers",
      "crawler": "backend/crawlers/sources/edinet_officers.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 579,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "edinet_officers",
          "enabled": true,
          "line": 515
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "EDINET 役員一覧 (有報)",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://api.edinet-fsa.go.jp/api/v2",
          "symbol": "EDINET_API",
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 65,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "edinet_officers",
          "line": 515,
          "module_chain": [
            "backend.crawlers.sources.edinet_officers"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "edinet_officers",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 07:00",
          "command": "python3 -m backend.crawlers.sources.edinet_officers",
          "modules": [
            "backend.crawlers.sources.edinet_officers"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T07:00:00+09:00",
              "beijing": "2026-11-09T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T07:00:00+09:00",
              "beijing": "2026-11-16T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T07:00:00+09:00",
              "beijing": "2026-11-23T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 515,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jftc_subcontract_recommendations",
      "crawler": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jftc_subcontract_recommendations",
          "enabled": true,
          "line": 1140
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公正取引委員会 下請法勧告一覧",
      "source_url": "https://data.e-gov.go.jp/data/dataset/jftc_20170314_0031",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jftc_subcontract_recommendations",
          "line": 1140,
          "module_chain": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jftc_subcontract_recommendations",
          "scheduler": "schedule.yaml",
          "cron": "55 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:55",
          "command": "python3 -m backend.crawlers.sources.jftc_subcontract_recommendations --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.jftc_subcontract_recommendations"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:55:00+09:00",
              "beijing": "2026-12-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:55:00+09:00",
              "beijing": "2027-01-03T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:55:00+09:00",
              "beijing": "2027-02-03T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1140,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "government_procurement_suspensions",
      "crawler": "backend/crawlers/sources/government_procurement_suspensions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 39,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "government_procurement_suspensions",
          "enabled": true,
          "line": 1158
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "政府・自治体 指名停止・入札参加停止情報",
      "source_url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
      "crawler_url_candidates": [
        {
          "url": "https://www.digital.go.jp/procurement/suspension-and-debarment",
          "symbol": "DIGITAL_URL",
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 43,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "government_procurement_suspensions",
          "line": 1158,
          "module_chain": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "government_procurement_suspensions",
          "scheduler": "schedule.yaml",
          "cron": "10 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:10",
          "command": "python3 -m backend.crawlers.sources.government_procurement_suspensions --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.government_procurement_suspensions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:10:00+09:00",
              "beijing": "2026-11-04T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:10:00+09:00",
              "beijing": "2026-11-05T07:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:10:00+09:00",
              "beijing": "2026-11-06T07:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1158,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_bcp_keizokuryoku",
          "enabled": true,
          "line": 1152
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "source_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list",
          "symbol": "DOWNLOAD_BASE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list/renkei_nintei_ichiran.xlsx",
          "symbol": "RENKEI_URL",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "source_page_url",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 268,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_bcp_keizokuryoku",
          "line": 1152,
          "module_chain": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "meti_bcp_keizokuryoku",
      "crawler": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 40,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "meti_bcp_keizokuryoku",
          "enabled": true,
          "line": 1152
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "中小企業庁 事業継続力強化計画 認定事業者一覧",
      "source_url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "SOURCE_PAGE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list",
          "symbol": "DOWNLOAD_BASE",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/download/list/renkei_nintei_ichiran.xlsx",
          "symbol": "RENKEI_URL",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.chusho.meti.go.jp/keiei/antei/bousai/list.html",
          "symbol": "source_page_url",
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 268,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "meti_bcp_keizokuryoku",
          "line": 1152,
          "module_chain": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_bcp_keizokuryoku",
          "scheduler": "schedule.yaml",
          "cron": "5 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:05",
          "command": "python3 -m backend.crawlers.sources.meti_bcp_keizokuryoku --reader-fallback --discover-from-page --skip-raw-s3 --sleep 1.0",
          "modules": [
            "backend.crawlers.sources.meti_bcp_keizokuryoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:05:00+09:00",
              "beijing": "2026-12-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:05:00+09:00",
              "beijing": "2027-01-03T07:05:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:05:00+09:00",
              "beijing": "2027-02-03T07:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1152,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 150,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sesc_actions",
          "enabled": true,
          "line": 931
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "証券取引等監視委員会 課徴金事例",
      "source_url": "https://www.fsa.go.jp/sesc/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 160,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 220,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sesc_actions",
          "line": 931,
          "module_chain": [
            "backend.crawlers.sources.sesc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sesc_actions",
      "crawler": "backend/crawlers/sources/sesc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 150,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "sesc_actions",
          "enabled": true,
          "line": 931
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "証券取引等監視委員会 課徴金事例",
      "source_url": "https://www.fsa.go.jp/sesc/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 160,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/sesc/kachoukin/{dynamic}torichou.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 220,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "sesc_actions",
          "line": 931,
          "module_chain": [
            "backend.crawlers.sources.sesc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "sesc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * 3",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周四 05:30",
          "command": "python3 -m backend.crawlers.sources.sesc_actions",
          "modules": [
            "backend.crawlers.sources.sesc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-12T05:30:00+09:00",
              "beijing": "2026-11-12T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-19T05:30:00+09:00",
              "beijing": "2026-11-19T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 931,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "isms_ac_certified_orgs",
      "crawler": "backend/crawlers/sources/isms_ac.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "isms_ac_certified_orgs",
          "enabled": true,
          "line": 1110
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "ISMS-AC ISMS認証取得組織検索",
      "source_url": "https://isms.jp/lst/ind/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://isms.jp/lst/ind/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "isms_ac_certified_orgs",
          "line": 1110,
          "module_chain": [
            "backend.crawlers.sources.isms_ac"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "isms_ac_certified_orgs",
          "scheduler": "schedule.yaml",
          "cron": "10 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:10",
          "command": "python3 -m backend.crawlers.sources.isms_ac --details",
          "modules": [
            "backend.crawlers.sources.isms_ac"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:10:00+09:00",
              "beijing": "2026-12-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:10:00+09:00",
              "beijing": "2027-01-03T04:10:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:10:00+09:00",
              "beijing": "2027-02-03T04:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1110,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 130,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ppc_actions",
          "enabled": true,
          "line": 127
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "個人情報保護委員会 処分",
      "source_url": "https://www.ppc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ppc.go.jp/news/press/{dynamic}/",
          "symbol": "url",
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ppc_actions",
          "line": 127,
          "module_chain": [
            "backend.crawlers.sources.ppc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ppc_actions",
      "crawler": "backend/crawlers/sources/ppc_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 130,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ppc_actions",
          "enabled": true,
          "line": 127
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "個人情報保護委員会 処分",
      "source_url": "https://www.ppc.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ppc.go.jp/news/press/{dynamic}/",
          "symbol": "url",
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 141,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ppc_actions",
          "line": 127,
          "module_chain": [
            "backend.crawlers.sources.ppc_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ppc_actions",
          "scheduler": "schedule.yaml",
          "cron": "30 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:30",
          "command": "python3 -m backend.crawlers.sources.ppc_actions",
          "modules": [
            "backend.crawlers.sources.ppc_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:30:00+09:00",
              "beijing": "2026-11-04T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:30:00+09:00",
              "beijing": "2026-11-05T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 127,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jipdec_pmark",
      "crawler": "backend/crawlers/sources/jipdec_pmark.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jipdec_pmark",
          "enabled": true,
          "line": 1104
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "JIPDEC プライバシーマーク付与事業者検索",
      "source_url": "https://entity-search.jipdec.or.jp/pmark/",
      "crawler_url_candidates": [
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 34,
          "origin": "online"
        },
        {
          "url": "https://entity-search.jipdec.or.jp/pmark/",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 80,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jipdec_pmark",
          "line": 1104,
          "module_chain": [
            "backend.crawlers.sources.jipdec_pmark"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jipdec_pmark",
          "scheduler": "schedule.yaml",
          "cron": "40 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:40",
          "command": "python3 -m backend.crawlers.sources.jipdec_pmark",
          "modules": [
            "backend.crawlers.sources.jipdec_pmark"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:40:00+09:00",
              "beijing": "2026-12-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:40:00+09:00",
              "beijing": "2027-01-03T03:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:40:00+09:00",
              "beijing": "2027-02-03T03:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1104,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 512,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources (\n            code, name_ja, name_en, category, authority, base_url, license_type,\n            priority, is_active, crawl_config, compliance_record\n        ) VALUES (\n            %s, %s, %s, 'ip', %s, %s, 'registered_api', 'P0', TRUE,\n            %s::jsonb, %s::jsonb\n        )\n        ON CONFLICT (code) DO UPDATE\n           SET name_ja=EXCLUDED.name_ja,\n               name_en=EXCLUDED.name_en,\n               category=EXCLUDED.category,\n               authority=EXCLUDED.authority,\n               base_url=EXCLUDED.base_url,\n               license_type=EXCLUDED.license_type,\n               priority=EXCLUDED.priority,\n               is_active=EXCLUDED.is_active,\n               crawl_config=data_sources.crawl_config || EXCLUDED.crawl_config,\n               compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n               updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jpo_ip_api",
      "crawler": "backend/crawlers/sources/jpo_trademark_api.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 47,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jpo_ip_api",
          "enabled": false,
          "line": 626
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "特許庁 知財情報API / J-PlatPat",
      "source_url": "https://ip-data.jpo.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "DEFAULT_API_BASE_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/auth/token",
          "symbol": "DEFAULT_AUTH_URL",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 50,
          "origin": "online"
        },
        {
          "url": "https://ip-data.jpo.go.jp/api",
          "symbol": "api_base_url",
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 543,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "disabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jpo_ip_api",
          "scheduler": "schedule.yaml",
          "cron": "20 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": false,
          "frequency": "daily",
          "label": "每天 09:20",
          "command": "python3 -m backend.crawlers.sources.jpo_trademark_api --limit 300 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.jpo_trademark_api"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [],
          "file": "backend/crawlers/schedule.yaml",
          "line": 626,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [],
      "schedule_coverage": "configured_disabled",
      "schedule_coverage_note": "只找到停用计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 101,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_actions",
          "enabled": true,
          "line": 97
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 行政処分",
      "source_url": "https://www.fsa.go.jp/news/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "EXCEL_URL",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 178,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_actions",
          "line": 97,
          "module_chain": [
            "backend.crawlers.sources.fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fsa_actions",
      "crawler": "backend/crawlers/sources/fsa.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 101,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_actions",
          "enabled": true,
          "line": 97
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 行政処分",
      "source_url": "https://www.fsa.go.jp/news/",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "EXCEL_URL",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/status/s_jirei/s_jirei.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa.py",
          "line": 178,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_actions",
          "line": 97,
          "module_chain": [
            "backend.crawlers.sources.fsa"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_actions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:00",
          "command": "python3 -m backend.crawlers.sources.fsa",
          "modules": [
            "backend.crawlers.sources.fsa"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:00:00+09:00",
              "beijing": "2026-11-04T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:00:00+09:00",
              "beijing": "2026-11-05T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 97,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "moj_e_koukoku",
      "crawler": "backend/crawlers/sources/moj_e_koukoku.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "moj_e_koukoku",
          "enabled": true,
          "line": 668
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        8
      ],
      "source_name": "法務省電子公告システム",
      "source_url": "https://e-koukoku.moj.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://e-koukoku.moj.go.jp/",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/data.js",
          "symbol": "DATA_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://e-koukoku.moj.go.jp/js/date.js",
          "symbol": "DATE_URL",
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 53,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "moj_e_koukoku",
          "line": 668,
          "module_chain": [
            "backend.crawlers.sources.moj_e_koukoku"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "moj_e_koukoku",
          "scheduler": "schedule.yaml",
          "cron": "20 0,6,12,18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每天 00:20、06:20、12:20、18:20",
          "command": "python3 -m backend.crawlers.sources.moj_e_koukoku --apply --skip-s3",
          "modules": [
            "backend.crawlers.sources.moj_e_koukoku"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "current_snapshot",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T00:20:00+09:00",
              "beijing": "2026-11-03T23:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 668,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 144,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 32,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 215,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 144,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 32,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit.py",
          "line": 215,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2277,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 特定商取引法ガイド 執行事例検索",
      "source_url": "https://www.no-trouble.caa.go.jp/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.no-trouble.caa.go.jp/search/",
          "symbol": "NO_TROUBLE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 50,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "caa_no_trouble",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2277,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 特定商取引法ガイド 執行事例検索",
      "source_url": "https://www.no-trouble.caa.go.jp/search/",
      "crawler_url_candidates": [
        {
          "url": "https://www.no-trouble.caa.go.jp/search/",
          "symbol": "NO_TROUBLE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 50,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_no_trouble",
          "scheduler": "schedule.yaml",
          "cron": "45 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source caa_no_trouble --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "caa_no_trouble"
          ],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:45:00+09:00",
              "beijing": "2026-11-04T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:45:00+09:00",
              "beijing": "2026-11-05T05:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:45:00+09:00",
              "beijing": "2026-11-06T05:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 121,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2386,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定暴力団一覧",
      "source_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "npa_designated_boryokudan",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2386,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定暴力団一覧",
      "source_url": "https://www.npa.go.jp/bureau/sosikihanzai/bouryokudan.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_designated_boryokudan",
          "scheduler": "schedule.yaml",
          "cron": "40 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_designated_boryokudan",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_designated_boryokudan"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:40:00+09:00",
              "beijing": "2026-11-10T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:40:00+09:00",
              "beijing": "2026-11-17T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:40:00+09:00",
              "beijing": "2026-11-24T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 174,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2464,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定重要指名手配",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "npa_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2464,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "警察庁 指定重要指名手配",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "npa_wanted",
          "scheduler": "schedule.yaml",
          "cron": "45 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:45",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source npa_wanted",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "npa_wanted"
          ],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:45:00+09:00",
              "beijing": "2026-11-10T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:45:00+09:00",
              "beijing": "2026-11-17T06:45:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:45:00+09:00",
              "beijing": "2026-11-24T06:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 180,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2513,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "都道府県警察 指名手配ページ",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "prefectural_police_wanted",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2513,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "都道府県警察 指名手配ページ",
      "source_url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "NPA_BORYOKUDAN_PDF",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 51,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "NPA_BORYOKUDAN_CSV",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 52,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/index.html",
          "symbol": "NPA_WANTED_INDEX",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 53,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/bureau/criminal/wanted/link.html",
          "symbol": "NPA_PREFECTURAL_WANTED_LINKS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/r6toukeisotai0223.csv",
          "symbol": "csv_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2451,
          "origin": "online"
        },
        {
          "url": "https://www.npa.go.jp/publications/statistics/kikakubunseki/R6jyousei.pdf",
          "symbol": "pdf_fallback_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2452,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "prefectural_police_wanted",
          "scheduler": "schedule.yaml",
          "cron": "48 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:48",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source prefectural_police_wanted --limit 0 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "prefectural_police_wanted"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:48:00+09:00",
              "beijing": "2026-11-10T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:48:00+09:00",
              "beijing": "2026-11-17T06:48:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:48:00+09:00",
              "beijing": "2026-11-24T06:48:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 186,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2620,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "source_url": "https://www.fcg-r.co.jp/research/incident.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.fcg-r.co.jp/research/incident.html",
          "symbol": "FCG_INCIDENT_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 59,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fcg_incidents",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2620,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "フジサンケイ危機管理研究室 企業事件・不祥事リスト",
      "source_url": "https://www.fcg-r.co.jp/research/incident.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.fcg-r.co.jp/research/incident.html",
          "symbol": "FCG_INCIDENT_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 59,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fcg_incidents",
          "scheduler": "schedule.yaml",
          "cron": "30 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:30",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source fcg_incidents --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "fcg_incidents"
          ],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:30:00+09:00",
              "beijing": "2026-11-10T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:30:00+09:00",
              "beijing": "2026-11-17T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:30:00+09:00",
              "beijing": "2026-11-24T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 222,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2671,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "YAKUZA WIKI 民間暴力団情報",
      "source_url": "https://www.yakuza.wiki/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 74,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_LIST_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 75,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "yakuza_wiki",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2671,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "YAKUZA WIKI 民間暴力団情報",
      "source_url": "https://www.yakuza.wiki/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 74,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza.wiki/",
          "symbol": "YAKUZA_WIKI_LIST_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 75,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_wiki",
          "scheduler": "schedule.yaml",
          "cron": "35 8 * * 0",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周一 08:35",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_wiki --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_wiki"
          ],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T08:35:00+09:00",
              "beijing": "2026-11-09T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-16T08:35:00+09:00",
              "beijing": "2026-11-16T07:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-23T08:35:00+09:00",
              "beijing": "2026-11-23T07:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 228,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2760,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暴力団ニュース～ヤクザ事件簿",
      "source_url": "https://www.yakuza-news.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza-news.jp/",
          "symbol": "YAKUZA_NEWS_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 76,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/posts",
          "symbol": "YAKUZA_NEWS_POSTS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/categories",
          "symbol": "YAKUZA_NEWS_CATEGORIES_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/tags",
          "symbol": "YAKUZA_NEWS_TAGS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "yakuza_news",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2760,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "暴力団ニュース～ヤクザ事件簿",
      "source_url": "https://www.yakuza-news.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.yakuza-news.jp/",
          "symbol": "YAKUZA_NEWS_BASE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 76,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/posts",
          "symbol": "YAKUZA_NEWS_POSTS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 77,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/categories",
          "symbol": "YAKUZA_NEWS_CATEGORIES_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 78,
          "origin": "online"
        },
        {
          "url": "https://www.yakuza-news.jp/wp-json/wp/v2/tags",
          "symbol": "YAKUZA_NEWS_TAGS_API",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 79,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "yakuza_news",
          "scheduler": "schedule.yaml",
          "cron": "38 8 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 08:38",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source yakuza_news --limit 500 --rps 0.2",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "yakuza_news"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T08:38:00+09:00",
              "beijing": "2026-11-04T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T08:38:00+09:00",
              "beijing": "2026-11-05T07:38:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T08:38:00+09:00",
              "beijing": "2026-11-06T07:38:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 234,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2928,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公安調査庁 国際テロリズム要覧",
      "source_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
          "symbol": "PSIA_TERROR_ORGS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "psia_terror_orgs",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 2928,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "公安調査庁 国際テロリズム要覧",
      "source_url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.moj.go.jp/psia/ITH/organizations/index.html",
          "symbol": "PSIA_TERROR_ORGS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 60,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "psia_terror_orgs",
          "scheduler": "schedule.yaml",
          "cron": "40 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:40",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source psia_terror_orgs --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "psia_terror_orgs"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:40:00+09:00",
              "beijing": "2026-11-10T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:40:00+09:00",
              "beijing": "2026-11-17T07:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:40:00+09:00",
              "beijing": "2026-11-24T07:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 240,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3061,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "経産省 外国ユーザーリスト",
      "source_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "METI_FOREIGN_USER_PRESS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "METI_FOREIGN_USER_PDF_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3098,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "fallback_pdf_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3183,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "meti_foreign_user_list",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3061,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "経産省 外国ユーザーリスト",
      "source_url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "METI_FOREIGN_USER_PRESS_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "METI_FOREIGN_USER_PDF_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3098,
          "origin": "online"
        },
        {
          "url": "https://www.meti.go.jp/press/2025/09/20250929006/20250929006-1.pdf",
          "symbol": "fallback_pdf_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3183,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "meti_foreign_user_list",
          "scheduler": "schedule.yaml",
          "cron": "50 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:50",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source meti_foreign_user_list --limit 0",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "meti_foreign_user_list"
          ],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:50:00+09:00",
              "beijing": "2026-11-10T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:50:00+09:00",
              "beijing": "2026-11-17T07:50:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:50:00+09:00",
              "beijing": "2026-11-24T07:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 246,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3192,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "FUKUOKA_BORYOKUDAN_EXCLUSION_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "fukuoka_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "pref_boryokudan_exclusion",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3192,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "自治体 暴力団関係事業者 指名停止・入札参加除外",
      "source_url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "FUKUOKA_BORYOKUDAN_EXCLUSION_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 64,
          "origin": "online"
        },
        {
          "url": "https://www.pref.fukuoka.lg.jp/contents/bohai.html",
          "symbol": "fukuoka_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3404,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pref_boryokudan_exclusion",
          "scheduler": "schedule.yaml",
          "cron": "52 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:52",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source pref_boryokudan_exclusion",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "pref_boryokudan_exclusion"
          ],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:52:00+09:00",
              "beijing": "2026-11-10T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:52:00+09:00",
              "beijing": "2026-11-17T06:52:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:52:00+09:00",
              "beijing": "2026-11-24T06:52:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 192,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3422,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "静岡県公安委員会 暴力団排除条例 公表結果",
      "source_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "SHIZUOKA_BORYOKUDAN_PUBLIC_NOTICE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "index_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3502,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "shizuoka_boryokudan_public_notice",
      "crawler": "backend/crawlers/sources/anti_social_public.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3422,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_no_trouble",
          "enabled": true,
          "line": 121
        },
        {
          "task": "npa_designated_boryokudan",
          "enabled": true,
          "line": 174
        },
        {
          "task": "npa_wanted",
          "enabled": true,
          "line": 180
        },
        {
          "task": "prefectural_police_wanted",
          "enabled": true,
          "line": 186
        },
        {
          "task": "pref_boryokudan_exclusion",
          "enabled": true,
          "line": 192
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "enabled": true,
          "line": 198
        },
        {
          "task": "fcg_incidents",
          "enabled": true,
          "line": 222
        },
        {
          "task": "yakuza_wiki",
          "enabled": true,
          "line": 228
        },
        {
          "task": "yakuza_news",
          "enabled": true,
          "line": 234
        },
        {
          "task": "psia_terror_orgs",
          "enabled": true,
          "line": 240
        },
        {
          "task": "meti_foreign_user_list",
          "enabled": true,
          "line": 246
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "静岡県公安委員会 暴力団排除条例 公表結果",
      "source_url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "SHIZUOKA_BORYOKUDAN_PUBLIC_NOTICE_URL",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 73,
          "origin": "online"
        },
        {
          "url": "https://www.pref.shizuoka.jp/police/kurashi/shizuokajore/haijo.html",
          "symbol": "index_url",
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 3502,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_no_trouble",
          "line": 121,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_designated_boryokudan",
          "line": 174,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "npa_wanted",
          "line": 180,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "prefectural_police_wanted",
          "line": 186,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "pref_boryokudan_exclusion",
          "line": 192,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "shizuoka_boryokudan_public_notice",
          "line": 198,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "fcg_incidents",
          "line": 222,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_wiki",
          "line": 228,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "yakuza_news",
          "line": 234,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "psia_terror_orgs",
          "line": 240,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        },
        {
          "task": "meti_foreign_user_list",
          "line": 246,
          "module_chain": [
            "backend.crawlers.sources.anti_social_public"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "shizuoka_boryokudan_public_notice",
          "scheduler": "schedule.yaml",
          "cron": "55 7 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 07:55",
          "command": "python3 -m backend.crawlers.sources.anti_social_public --source shizuoka_boryokudan_public_notice",
          "modules": [
            "backend.crawlers.sources.anti_social_public"
          ],
          "selected_sources": [
            "shizuoka_boryokudan_public_notice"
          ],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T07:55:00+09:00",
              "beijing": "2026-11-10T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T07:55:00+09:00",
              "beijing": "2026-11-17T06:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T07:55:00+09:00",
              "beijing": "2026-11-24T06:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 198,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ipa_security_action",
      "crawler": "backend/crawlers/sources/ipa_security_action.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 45,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ipa_security_action",
          "enabled": true,
          "line": 1116
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "IPA SECURITY ACTION セキュリティ対策自己宣言事業者一覧",
      "source_url": "https://www.ipa.go.jp/security/security-action/activity/",
      "crawler_url_candidates": [
        {
          "url": "https://www.ipa.go.jp/security/security-action/activity/",
          "symbol": "PAGE_URL",
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 46,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ipa_security_action",
          "line": 1116,
          "module_chain": [
            "backend.crawlers.sources.ipa_security_action"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ipa_security_action",
          "scheduler": "schedule.yaml",
          "cron": "45 5 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 05:45",
          "command": "python3 -m backend.crawlers.sources.ipa_security_action --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.ipa_security_action"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T05:45:00+09:00",
              "beijing": "2026-12-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T05:45:00+09:00",
              "beijing": "2027-01-03T04:45:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T05:45:00+09:00",
              "beijing": "2027-02-03T04:45:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1116,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7342,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources\n              (code, name_ja, name_en, category, authority, base_url, license_type,\n               priority, is_active, crawl_config, compliance_record)\n            VALUES\n              (%s, '地方自治体 表彰・受賞公告', 'Local Government Public Recognitions',\n               'public_recognition', '地方自治体', NULL, 'public_web', 'P2', TRUE,\n               jsonb_build_object('rps', 0.2, 'concurrency', 1, 'method', 'official_html_news_pages'),\n               jsonb_build_object('note', 'Official local-government award and recognition announcement pages.'))\n            ON CONFLICT (code) DO UPDATE SET\n              updated_at = now(),\n              crawl_config = data_sources.crawl_config || EXCLUDED.crawl_config,\n              compliance_record = data_sources.compliance_record || EXCLUDED.compliance_record\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        5,
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "local_public_recognition_root_runs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "local_public_recognition_root_runs",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 7415,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO local_public_recognition_root_runs\n              (source_id, job_id, root_url, root_url_hash, prefecture, municipality,\n               authority, jurisdiction_type, started_at, finished_at, status,\n               discovered_candidate_urls, candidate_urls, fetched_urls, parsed_records,\n               inserted_records, updated_records, failed_urls, skipped_host_blocked,\n               error_message, meta)\n            VALUES\n              (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s,\n               %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\n            "
        }
      ],
      "dimensions": [
        5,
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "公告入口运行记录"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        5,
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "local_public_recognitions",
      "crawler": "backend/crawlers/sources/local_public_recognitions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 55,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "local_public_recognitions",
          "enabled": true,
          "line": 258
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        5,
        10
      ],
      "source_name": "地方自治体 表彰・受賞公告",
      "source_url": null,
      "crawler_url_candidates": [
        {
          "url": "https://code4fukui.github.io/localgovjp/localgovjp-utf8.csv",
          "symbol": "CODE4FUKUI_LOCALGOV_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 108,
          "origin": "online"
        },
        {
          "url": "https://code4fukui.github.io/localgovjp/prefjp-utf8.csv",
          "symbol": "CODE4FUKUI_PREFECTURE_CSV_URL",
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 109,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "local_public_recognitions",
          "line": 258,
          "module_chain": [
            "backend.crawlers.sources.local_public_recognitions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "local_public_recognitions",
          "scheduler": "schedule.yaml",
          "cron": "35 9 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 09:35",
          "command": "python3 -m backend.crawlers.sources.local_public_recognitions --no-default-seeds --default-localgov-roots --localgov-root-slice-mod 4 --localgov-root-slice-index-from-date --localgov-max-existing-records 1 --localgov-skip-recent-root-run-hours 168 --localgov-max-roots-per-host 3 --localgov-coverage-limit 320 --localgov-coverage-offset-from-date --skip-known-source-urls --skip-s3 --discovery-workers 256 --workers 36 --write-workers 1 --per-domain-rps 0.75 --rps 30 --request-timeout 6 --request-jitter-min 0.02 --request-jitter-max 0.12 --root-discovery-timeout 45 --fetch-attempts 1 --max-hard-refusals-per-host 2 --max-common-index-paths 420 --max-index-failures-per-root 5 --max-index-links-per-root 12 --max-search-index-links-per-root 4 --max-common-search-index-links-per-root 5 --max-sitemap-content-probe-links-per-index 50 --max-discovered-per-index 150 --expand-candidate-depth 1 --max-expanded-links-per-candidate 24 --max-expand-candidates-per-depth 90 --max-attachment-link-candidates 170 --max-attachment-links-per-candidate 3 --max-candidate-urls-per-host 12 --max-candidate-urls 720 --adaptive-speed --adaptive-batch-size 90 --adaptive-max-workers 52 --adaptive-max-rps 42 --adaptive-max-per-domain-rps 0.80 --adaptive-worker-step 4 --adaptive-rps-step 3.0 --adaptive-per-domain-rps-step 0.05 --adaptive-max-failure-rate 0.02 --adaptive-stable-batches 2 --max-global-rps 42",
          "modules": [
            "backend.crawlers.sources.local_public_recognitions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T09:35:00+09:00",
              "beijing": "2026-11-04T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T09:35:00+09:00",
              "beijing": "2026-11-05T08:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T09:35:00+09:00",
              "beijing": "2026-11-06T08:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 258,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 407,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SEC 会計監査関連処分（AAER）",
      "source_url": "https://www.sec.gov/divisions/enforce/friactions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sec_aaer",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 407,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "SEC 会計監査関連処分（AAER）",
      "source_url": "https://www.sec.gov/divisions/enforce/friactions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 528,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "米司法省 FCPA 関連処分",
      "source_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "doj_fcpa",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 528,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "米司法省 FCPA 関連処分",
      "source_url": "https://www.justice.gov/criminal/criminal-fraud/related-enforcement-actions",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 683,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC 50%ルール 間接保有 (派生)",
      "source_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ofac_indirect",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 683,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC 50%ルール 間接保有 (派生)",
      "source_url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        },
        {
          "url": "https://ec.europa.eu/competition/elojade/isef/index.cfm",
          "symbol": "INDEX_FALLBACK",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 996,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 993,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "欧州委員会 反トラスト・カルテル決定",
      "source_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "eu_antitrust",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 993,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "欧州委員会 反トラスト・カルテル決定",
      "source_url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
      "crawler_url_candidates": [
        {
          "url": "https://competition-policy.ec.europa.eu/cartels/cartel-cases_en",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 995,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1093,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "英国 FCA 行政処分",
      "source_url": "https://www.fca.org.uk/news/enforcement",
      "crawler_url_candidates": [
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "uk_fca",
      "crawler": "backend/crawlers/sources/foreign_enforcement.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1093,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "foreign_enforcement",
          "enabled": true,
          "line": 166
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "英国 FCA 行政処分",
      "source_url": "https://www.fca.org.uk/news/enforcement",
      "crawler_url_candidates": [
        {
          "url": "https://www.fca.org.uk/news/enforcement",
          "symbol": "NEWS_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1095,
          "origin": "online"
        },
        {
          "url": "https://www.fca.org.uk/publication/final-notices/",
          "symbol": "FINAL_URL",
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1096,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "foreign_enforcement",
          "line": 166,
          "module_chain": [
            "backend.crawlers.sources.foreign_enforcement"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "foreign_enforcement",
          "scheduler": "schedule.yaml",
          "cron": "30 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:30",
          "command": "python3 -m backend.crawlers.sources.foreign_enforcement",
          "modules": [
            "backend.crawlers.sources.foreign_enforcement"
          ],
          "selected_sources": [],
          "timeout_min_configured": 55,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:30:00+09:00",
              "beijing": "2026-11-04T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:30:00+09:00",
              "beijing": "2026-11-05T06:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:30:00+09:00",
              "beijing": "2026-11-06T06:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 166,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "data_go_jp_catalog",
      "crawler": "backend/crawlers/sources/data_go_jp_catalog.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 29,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "data_go_jp_catalog",
          "enabled": true,
          "line": 1086
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "data.go.jp データカタログ横断検索",
      "source_url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
      "crawler_url_candidates": [
        {
          "url": "https://data.e-gov.go.jp/data/api/3/action/package_search",
          "symbol": "API_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 30,
          "origin": "online"
        },
        {
          "url": "https://data.e-gov.go.jp/data/dataset/{name}",
          "symbol": "CATALOG_DATASET_URL",
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 31,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "data_go_jp_catalog",
          "line": 1086,
          "module_chain": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "data_go_jp_catalog",
          "scheduler": "schedule.yaml",
          "cron": "40 3 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 03:40",
          "command": "python3 -m backend.crawlers.sources.data_go_jp_catalog --rows 100 --max-pages 10 --sleep 0.25",
          "modules": [
            "backend.crawlers.sources.data_go_jp_catalog"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:40:00+09:00",
              "beijing": "2026-11-04T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T03:40:00+09:00",
              "beijing": "2026-11-11T02:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T03:40:00+09:00",
              "beijing": "2026-11-18T02:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1086,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jsda_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 281,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本証券業協会 会員処分",
      "source_url": "https://www.jsda.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jsda.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 285,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jfsa_loan_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 290,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本貸金業協会 会員処分",
      "source_url": "https://www.j-fsa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.j-fsa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 294,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "zentaku_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 299,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国宅地建物取引業協会連合会 会員処分",
      "source_url": "https://www.zentaku.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zentaku.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 303,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "retpc_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 310,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "不動産流通推進センター 処分",
      "source_url": "https://www.retpc.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.retpc.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 314,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "seiho_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 319,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "生命保険協会 会員処分",
      "source_url": "https://www.seiho.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.seiho.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 323,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "sonpo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 330,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本損害保険協会 会員処分",
      "source_url": "https://www.sonpo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sonpo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 334,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "toushin_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 341,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "投資信託協会 会員処分",
      "source_url": "https://www.toushin.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.toushin.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 345,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jvcea_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 352,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本暗号資産取引業協会 自主規制処分",
      "source_url": "https://jvcea.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://jvcea.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 356,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "pcaj_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 364,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "日本資金決済業協会 会員処分",
      "source_url": "https://www.s-kessai.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.s-kessai.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 368,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "t2fifa_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 375,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "第二種金融商品取引業協会 会員処分",
      "source_url": "https://www.t2fifa.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.t2fifa.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 379,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 402,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\nINSERT INTO data_sources\n  (code, name_ja, name_en, category, authority, base_url,\n   license_type, priority, is_active, crawl_config, compliance_record)\nVALUES (%s, %s, %s, 'admin_action', %s, %s,\n        'public_domain', 'P1', TRUE, %s::jsonb, %s::jsonb)\nON CONFLICT (code) DO UPDATE SET\n  name_ja=EXCLUDED.name_ja,\n  base_url=EXCLUDED.base_url,\n  authority=EXCLUDED.authority,\n  crawl_config=EXCLUDED.crawl_config,\n  updated_at=now()\n"
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "zenginkyo_actions",
      "crawler": "backend/crawlers/sources/industry_assoc.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 386,
          "kind": "source_spec",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "industry_assoc_sanctions",
          "enabled": true,
          "line": 475
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "全国銀行協会 自主規制処分",
      "source_url": "https://www.zenginkyo.or.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.zenginkyo.or.jp/",
          "symbol": "base_url",
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 390,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "industry_assoc_sanctions",
          "line": 475,
          "module_chain": [
            "backend.crawlers.sources.industry_assoc"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "industry_assoc_sanctions",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 06:00",
          "command": "python3 -m backend.crawlers.sources.industry_assoc",
          "modules": [
            "backend.crawlers.sources.industry_assoc"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T06:00:00+09:00",
              "beijing": "2026-11-10T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T06:00:00+09:00",
              "beijing": "2026-11-17T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T06:00:00+09:00",
              "beijing": "2026-11-24T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 475,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 113,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_recall",
          "enabled": true,
          "line": 115
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 リコール情報",
      "source_url": "https://www.recall.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 162,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_recall",
          "line": 115,
          "module_chain": [
            "backend.crawlers.sources.caa_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "caa_recall",
      "crawler": "backend/crawlers/sources/caa_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 113,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_recall",
          "enabled": true,
          "line": 115
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 リコール情報",
      "source_url": "https://www.recall.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://www.recall.caa.go.jp/result/index.php",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 162,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_recall",
          "line": 115,
          "module_chain": [
            "backend.crawlers.sources.caa_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_recall",
          "scheduler": "schedule.yaml",
          "cron": "25 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:25",
          "command": "python3 -m backend.crawlers.sources.caa_recall",
          "modules": [
            "backend.crawlers.sources.caa_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:25:00+09:00",
              "beijing": "2026-11-04T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:25:00+09:00",
              "beijing": "2026-11-05T05:25:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:25:00+09:00",
              "beijing": "2026-11-06T05:25:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 115,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 98,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_actions",
          "enabled": true,
          "line": 109
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 処分公表",
      "source_url": "https://www.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.caa.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_actions",
          "line": 109,
          "module_chain": [
            "backend.crawlers.sources.caa_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "caa_actions",
      "crawler": "backend/crawlers/sources/caa_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 98,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "caa_actions",
          "enabled": true,
          "line": 109
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "消費者庁 処分公表",
      "source_url": "https://www.caa.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.caa.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "caa_actions",
          "line": 109,
          "module_chain": [
            "backend.crawlers.sources.caa_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "caa_actions",
          "scheduler": "schedule.yaml",
          "cron": "20 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:20",
          "command": "python3 -m backend.crawlers.sources.caa_actions",
          "modules": [
            "backend.crawlers.sources.caa_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:20:00+09:00",
              "beijing": "2026-11-04T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:20:00+09:00",
              "beijing": "2026-11-05T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:20:00+09:00",
              "beijing": "2026-11-06T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 109,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_license_lists",
          "enabled": true,
          "line": 1146
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "source_url": "https://data.e-gov.go.jp/data/group/fsa",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx: {dynamic}",
          "symbol": "msg",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 494,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 159,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 291,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_license_lists",
          "line": 1146,
          "module_chain": [
            "backend.crawlers.sources.fsa_license_lists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "fsa_license_lists",
      "crawler": "backend/crawlers/sources/fsa_license_lists.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "fsa_license_lists",
          "enabled": true,
          "line": 1146
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "金融庁 免許・許可・登録等を受けている業者一覧（Excel）",
      "source_url": "https://data.e-gov.go.jp/data/group/fsa",
      "crawler_url_candidates": [
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx: {dynamic}",
          "symbol": "msg",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 494,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 159,
          "origin": "online"
        },
        {
          "url": "https://www.fsa.go.jp/menkyo/hoken.xlsx",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 291,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "fsa_license_lists",
          "line": 1146,
          "module_chain": [
            "backend.crawlers.sources.fsa_license_lists"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "fsa_license_lists",
          "scheduler": "schedule.yaml",
          "cron": "0 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:00",
          "command": "python3 -m backend.crawlers.sources.fsa_license_lists --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.fsa_license_lists"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:00:00+09:00",
              "beijing": "2026-12-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:00:00+09:00",
              "beijing": "2027-01-03T07:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:00:00+09:00",
              "beijing": "2027-02-03T07:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1146,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "kaken",
      "crawler": "backend/crawlers/sources/kaken_research_projects.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 30,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "kaken",
          "enabled": true,
          "line": 1170
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "KAKEN 科学研究費助成事業データベース",
      "source_url": "https://kaken.nii.ac.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://kaken.nii.ac.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://kaken.nii.ac.jp/ja/search/",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 32,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "kaken",
          "line": 1170,
          "module_chain": [
            "backend.crawlers.sources.kaken_research_projects"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "kaken",
          "scheduler": "schedule.yaml",
          "cron": "55 8 * * 1",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周二 08:55",
          "command": "python3 -m backend.crawlers.sources.kaken_research_projects --rows 100 --max-pages 10 --request-delay 0.08",
          "modules": [
            "backend.crawlers.sources.kaken_research_projects"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-10T08:55:00+09:00",
              "beijing": "2026-11-10T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-17T08:55:00+09:00",
              "beijing": "2026-11-17T07:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-24T08:55:00+09:00",
              "beijing": "2026-11-24T07:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1170,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "address_base_registry_files",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "address_base_registry_files",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 225,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO address_base_registry_files (\n              source_id, dataset_type, scope, scope_code, title, download_url,\n              format, content_length, etag, last_modified, official_status,\n              raw_metadata, fetched_at, updated_at\n            ) VALUES (\n              %s, %s, 'all', NULL, %s, %s,\n              'csv.zip', %s, %s, %s, 'official',\n              %s::jsonb, now(), now()\n            )\n            ON CONFLICT (download_url) DO UPDATE SET\n              content_length = EXCLUDED.content_length,\n              etag = EXCLUDED.etag,\n              last_modified = EXCLUDED.last_modified,\n              raw_metadata = EXCLUDED.raw_metadata,\n              fetched_at = EXCLUDED.fetched_at,\n              updated_at = now()\n            RETURNING id\n            "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "地址主数据下载批次"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "address_base_registry_aza",
      "crawler": "backend/crawlers/sources/address_base_registry.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 38,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "address_base_registry_aza",
          "enabled": true,
          "line": 1095
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        3
      ],
      "source_name": "アドレス・ベース・レジストリ 町字マスター",
      "source_url": "https://www.digital.go.jp/policies/base_registry_address",
      "crawler_url_candidates": [
        {
          "url": "https://data.address-br.digital.go.jp/mt_town/mt_town_all.csv.zip",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://dataset.address-br.digital.go.jp/api/search/v1/collections/all/items",
          "symbol": "CATALOG_API_URL",
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 42,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "address_base_registry_aza",
          "line": 1095,
          "module_chain": [
            "backend.crawlers.sources.address_base_registry"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "address_base_registry_aza",
          "scheduler": "schedule.yaml",
          "cron": "20 4 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 04:20",
          "command": "python3 -m backend.crawlers.sources.address_base_registry",
          "modules": [
            "backend.crawlers.sources.address_base_registry"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T04:20:00+09:00",
              "beijing": "2026-12-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T04:20:00+09:00",
              "beijing": "2027-01-03T03:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T04:20:00+09:00",
              "beijing": "2027-02-03T03:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1095,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 161,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "衆議院議員一覧",
      "source_url": "https://www.shugiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/syu/{n}giin.htm",
          "symbol": "SHUGIIN_URL_TPL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "diet_shugiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 161,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "衆議院議員一覧",
      "source_url": "https://www.shugiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.shugiin.go.jp/internet/itdb_annai.nsf/html/statics/syu/{n}giin.htm",
          "symbol": "SHUGIIN_URL_TPL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "参議院議員一覧",
      "source_url": "https://www.sangiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sangiin.go.jp/japanese/joho1/kousei/giin/221/giin.htm",
          "symbol": "SANGIIN_URL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "diet_sangiin",
      "crawler": "backend/crawlers/sources/diet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "diet_pep",
          "enabled": true,
          "line": 506
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6
      ],
      "source_name": "参議院議員一覧",
      "source_url": "https://www.sangiin.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.sangiin.go.jp/japanese/joho1/kousei/giin/221/giin.htm",
          "symbol": "SANGIIN_URL",
          "file": "backend/crawlers/sources/diet.py",
          "line": 36,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "diet_pep",
          "line": 506,
          "module_chain": [
            "backend.crawlers.sources.diet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "diet_pep",
          "scheduler": "schedule.yaml",
          "cron": "0 14 14 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 14 日 14:00",
          "command": "python3 -m backend.crawlers.sources.diet",
          "modules": [
            "backend.crawlers.sources.diet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-14T14:00:00+09:00",
              "beijing": "2026-11-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-14T14:00:00+09:00",
              "beijing": "2026-12-14T13:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-14T14:00:00+09:00",
              "beijing": "2027-01-14T13:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 506,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jetro_case_studies",
      "crawler": "backend/crawlers/sources/jetro_case_studies.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 32,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jetro_case_studies",
          "enabled": true,
          "line": 1164
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "ジェトロ活用事例",
      "source_url": "https://www.jetro.go.jp/case_study/",
      "crawler_url_candidates": [
        {
          "url": "https://www.jetro.go.jp/case_study/",
          "symbol": "INDEX_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 33,
          "origin": "online"
        },
        {
          "url": "https://www.jetro.go.jp",
          "symbol": "BASE_URL",
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 34,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jetro_case_studies",
          "line": 1164,
          "module_chain": [
            "backend.crawlers.sources.jetro_case_studies"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "jetro_case_studies",
          "scheduler": "schedule.yaml",
          "cron": "30 8 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 08:30",
          "command": "python3 -m backend.crawlers.sources.jetro_case_studies",
          "modules": [
            "backend.crawlers.sources.jetro_case_studies"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T08:30:00+09:00",
              "beijing": "2026-12-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T08:30:00+09:00",
              "beijing": "2027-01-03T07:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T08:30:00+09:00",
              "beijing": "2027-02-03T07:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1164,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 194,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 197,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士懲戒処分公告",
      "source_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "zeirishi_chokai",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 194,
          "kind": "lookup_source_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 197,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士懲戒処分公告",
      "source_url": "https://www.nta.go.jp/taxes/zeirishi/chokai/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 201,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国税庁 公示・刑事告発",
      "source_url": "https://www.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "nta_taino",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 201,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国税庁 公示・刑事告発",
      "source_url": "https://www.nta.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 204,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士情報検索",
      "source_url": "https://www.zeirishikensaku.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "zeirishi",
      "crawler": "backend/crawlers/sources/zeirishi_chokai.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 204,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "zeirishi_chokai",
          "enabled": true,
          "line": 939
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "税理士情報検索",
      "source_url": "https://www.zeirishikensaku.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.nta.go.jp",
          "symbol": "ROOT",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.nta.go.jp/taxes/zeirishi/chokai/chokai.htm",
          "symbol": "CHOKAI_INDEX",
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 49,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "zeirishi_chokai",
          "line": 939,
          "module_chain": [
            "backend.crawlers.sources.zeirishi_chokai"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "zeirishi_chokai",
          "scheduler": "schedule.yaml",
          "cron": "0 6 * * 4",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周五 06:00",
          "command": "python3 -m backend.crawlers.sources.zeirishi_chokai",
          "modules": [
            "backend.crawlers.sources.zeirishi_chokai"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:00:00+09:00",
              "beijing": "2026-11-06T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-13T06:00:00+09:00",
              "beijing": "2026-11-13T05:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-20T06:00:00+09:00",
              "beijing": "2026-11-20T05:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 939,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 84,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_jidosha",
          "enabled": true,
          "line": 160
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 自動車事業者処分",
      "source_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 130,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_jidosha",
          "line": 160,
          "module_chain": [
            "backend.crawlers.sources.jidosha"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mlit_jidosha",
      "crawler": "backend/crawlers/sources/jidosha.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 84,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_jidosha",
          "enabled": true,
          "line": 160
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 自動車事業者処分",
      "source_url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "LIST_URL",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 31,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 94,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/jidosha/anzen/03punishment/cgi-bin/list.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 130,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_jidosha",
          "line": 160,
          "module_chain": [
            "backend.crawlers.sources.jidosha"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_jidosha",
          "scheduler": "schedule.yaml",
          "cron": "20 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:20",
          "command": "python3 -m backend.crawlers.sources.jidosha",
          "modules": [
            "backend.crawlers.sources.jidosha"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:20:00+09:00",
              "beijing": "2026-11-04T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:20:00+09:00",
              "beijing": "2026-11-05T06:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:20:00+09:00",
              "beijing": "2026-11-06T06:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 160,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 365,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_koyou_fraud",
          "enabled": true,
          "line": 581
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
          "symbol": "UMBRELLA_URL",
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_koyou_fraud",
          "line": 581,
          "module_chain": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mhlw_koyou_fraud",
      "crawler": "backend/crawlers/sources/mhlw_koyou_fraud.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 365,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_koyou_fraud",
          "enabled": true,
          "line": 581
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/kochokin_husei.html",
          "symbol": "UMBRELLA_URL",
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 45,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_koyou_fraud",
          "line": 581,
          "module_chain": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_koyou_fraud",
          "scheduler": "schedule.yaml",
          "cron": "0 4 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 04:00",
          "command": "python3 -m backend.crawlers.sources.mhlw_koyou_fraud",
          "modules": [
            "backend.crawlers.sources.mhlw_koyou_fraud"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T04:00:00+09:00",
              "beijing": "2026-12-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T04:00:00+09:00",
              "beijing": "2027-01-01T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T04:00:00+09:00",
              "beijing": "2027-02-01T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 581,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        6,
        10
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mhlw_positive_ryouritsu",
      "crawler": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "enabled": true,
          "line": 1122
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        6,
        10
      ],
      "source_name": "厚生労働省 女性の活躍推進企業データベース オープンデータ",
      "source_url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
      "crawler_url_candidates": [
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/",
          "symbol": "OPEN_DATA_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "DOWNLOAD_URL",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://positive-ryouritsu.mhlw.go.jp/positivedb/opendata/download_nb.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 137,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_positive_ryouritsu",
          "line": 1122,
          "module_chain": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_positive_ryouritsu",
          "scheduler": "schedule.yaml",
          "cron": "20 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:20",
          "command": "python3 -m backend.crawlers.sources.mhlw_positive_ryouritsu --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.mhlw_positive_ryouritsu"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:20:00+09:00",
              "beijing": "2026-12-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:20:00+09:00",
              "beijing": "2027-01-03T05:20:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:20:00+09:00",
              "beijing": "2027-02-03T05:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1122,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 341,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO data_sources (code, name_ja, category, authority, base_url, license_type, priority, is_active)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, TRUE)\n            ON CONFLICT (code) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "tsr_bankruptcy",
      "crawler": "backend/crawlers/sources/tsr_bankruptcy.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 57,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tsr_bankruptcy",
          "enabled": true,
          "line": 26
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "enabled": true,
          "line": 91
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "TSR速報 (倒産情報)",
      "source_url": "https://www.tsr-net.co.jp/news/tsr/index.html",
      "crawler_url_candidates": [
        {
          "url": "https://www.tsr-net.co.jp/rss/news_flash.xml",
          "symbol": "RSS_URL",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/detail/",
          "symbol": "DETAIL_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 61,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/news/tsr/index.html",
          "symbol": "LIST_URL_PREFIX",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 62,
          "origin": "online"
        },
        {
          "url": "https://www.tsr-net.co.jp/sitemap.xml",
          "symbol": "sm_url",
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 412,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tsr_bankruptcy",
          "line": 26,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "line": 91,
          "module_chain": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tsr_bankruptcy",
          "scheduler": "schedule.yaml",
          "cron": "20 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 20 分",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode rss",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 10,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:20:00+09:00",
              "beijing": "2026-11-03T17:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:20:00+09:00",
              "beijing": "2026-11-03T18:20:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T20:20:00+09:00",
              "beijing": "2026-11-03T19:20:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 26,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "tsr_bankruptcy_sitemap",
          "scheduler": "schedule.yaml",
          "cron": "30 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:30",
          "command": "python3 -m backend.crawlers.sources.tsr_bankruptcy --mode sitemap",
          "modules": [
            "backend.crawlers.sources.tsr_bankruptcy"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:30:00+09:00",
              "beijing": "2026-11-04T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:30:00+09:00",
              "beijing": "2026-11-06T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 91,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily",
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 380,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_actions",
          "enabled": true,
          "line": 133
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "crawler_url_candidates": [
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "fallback",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 212,
          "origin": "online"
        },
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "landing_url",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 217,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_actions",
          "line": 133,
          "module_chain": [
            "backend.crawlers.sources.mhlw_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mhlw_actions",
      "crawler": "backend/crawlers/sources/mhlw_actions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 380,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mhlw_actions",
          "enabled": true,
          "line": 133
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "厚労省 都道府県労働局 労働基準法違反 公表事案 (ブラック企業リスト)",
      "source_url": "https://www.mhlw.go.jp/stf/seisakunitsuite/bunya/koyou_roudou/koyou/kyufukin/index_00020.html",
      "crawler_url_candidates": [
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "fallback",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 212,
          "origin": "online"
        },
        {
          "url": "https://jsite.mhlw.go.jp/{dynamic}-roudoukyoku/jirei_toukei",
          "symbol": "landing_url",
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 217,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mhlw_actions",
          "line": 133,
          "module_chain": [
            "backend.crawlers.sources.mhlw_actions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mhlw_actions",
          "scheduler": "schedule.yaml",
          "cron": "40 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:40",
          "command": "python3 -m backend.crawlers.sources.mhlw_actions",
          "modules": [
            "backend.crawlers.sources.mhlw_actions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:40:00+09:00",
              "beijing": "2026-11-04T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:40:00+09:00",
              "beijing": "2026-11-05T05:40:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:40:00+09:00",
              "beijing": "2026-11-06T05:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 133,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_negative_extended",
          "enabled": true,
          "line": 923
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "NEGA_SEARCH_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/content/001913487.xlsx",
          "symbol": "RYOKOU_XLSX_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 59,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "RYOKOU_PAGE_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 243,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_negative_extended",
          "line": 923,
          "module_chain": [
            "backend.crawlers.sources.mlit_negative_extended"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "mlit_negative",
      "crawler": "backend/crawlers/sources/mlit_negative_extended.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "mlit_negative_extended",
          "enabled": true,
          "line": 923
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "国交省 ネガティブ情報等検索",
      "source_url": "https://www.mlit.go.jp/nega-inf/",
      "crawler_url_candidates": [
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "NEGA_SEARCH_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 58,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/content/001913487.xlsx",
          "symbol": "RYOKOU_XLSX_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 59,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "RYOKOU_PAGE_URL",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 60,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/nega-inf/cgi-bin/search.cgi",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 243,
          "origin": "online"
        },
        {
          "url": "https://www.mlit.go.jp/kankocho/seisaku_seido/ryokogyoho/shobun.html",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 337,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "mlit_negative_extended",
          "line": 923,
          "module_chain": [
            "backend.crawlers.sources.mlit_negative_extended"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "mlit_negative_extended",
          "scheduler": "schedule.yaml",
          "cron": "0 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:00",
          "command": "python3 -m backend.crawlers.sources.mlit_negative_extended --rps 0.5",
          "modules": [
            "backend.crawlers.sources.mlit_negative_extended"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:00:00+09:00",
              "beijing": "2026-11-04T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:00:00+09:00",
              "beijing": "2026-11-11T04:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:00:00+09:00",
              "beijing": "2026-11-18T04:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 923,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "smart_sme_supporter",
      "crawler": "backend/crawlers/sources/smart_sme_supporter.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "smart_sme_supporter",
          "enabled": true,
          "line": 1134
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "スマートSMEサポーター 認定情報処理支援機関検索",
      "source_url": "https://www.smartsme.go.jp/SSS_SearchPage",
      "crawler_url_candidates": [
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchPage",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 38,
          "origin": "online"
        },
        {
          "url": "https://www.smartsme.go.jp/SSS_SearchDetailPage",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 39,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "smart_sme_supporter",
          "line": 1134,
          "module_chain": [
            "backend.crawlers.sources.smart_sme_supporter"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "smart_sme_supporter",
          "scheduler": "schedule.yaml",
          "cron": "40 7 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 07:40",
          "command": "python3 -m backend.crawlers.sources.smart_sme_supporter --skip-raw-s3",
          "modules": [
            "backend.crawlers.sources.smart_sme_supporter"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T07:40:00+09:00",
              "beijing": "2026-12-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T07:40:00+09:00",
              "beijing": "2027-01-03T06:40:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T07:40:00+09:00",
              "beijing": "2027-02-03T06:40:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1134,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 49,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC SDN List",
      "source_url": "https://www.treasury.gov/ofac/downloads/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "ofac_sdn",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 49,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "OFAC SDN List",
      "source_url": "https://www.treasury.gov/ofac/downloads/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "UN Sanctions List",
      "source_url": "https://www.un.org/securitycouncil/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "un_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 157,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "UN Sanctions List",
      "source_url": "https://www.un.org/securitycouncil/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 242,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "EU Sanctions",
      "source_url": "https://www.sanctionsmap.eu/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "eu_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 242,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "EU Sanctions",
      "source_url": "https://www.sanctionsmap.eu/",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "HMT UK Sanctions",
      "source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "uk_sanctions",
      "crawler": "backend/crawlers/sources/sanctions.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 384,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "ofac_sdn",
          "enabled": true,
          "line": 48
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "HMT UK Sanctions",
      "source_url": "https://www.gov.uk/government/publications/the-uk-sanctions-list",
      "crawler_url_candidates": [
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "OFAC_SDN_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "UN_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "EU_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "UK_SANCTIONS_XML",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 44,
          "origin": "online"
        },
        {
          "url": "https://www.treasury.gov/ofac/downloads/sdn.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 126,
          "origin": "online"
        },
        {
          "url": "https://scsanctions.un.org/resources/xml/en/consolidated.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 213,
          "origin": "online"
        },
        {
          "url": "https://webgate.ec.europa.eu/fsd/fsf/public/files/xmlFullSanctionsList_1_1/content",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 352,
          "origin": "online"
        },
        {
          "url": "https://ofsistorage.blob.core.windows.net/publishlive/2022format/ConList.xml",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 451,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "module_declared_endpoints_not_source_resolved",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "ofac_sdn",
          "line": 48,
          "module_chain": [
            "backend.crawlers.sources.sanctions"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "ofac_sdn",
          "scheduler": "schedule.yaml",
          "cron": "5 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:05",
          "command": "python3 -m backend.crawlers.sources.sanctions",
          "modules": [
            "backend.crawlers.sources.sanctions"
          ],
          "selected_sources": [],
          "timeout_min_configured": 75,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:05:00+09:00",
              "beijing": "2026-11-04T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:05:00+09:00",
              "beijing": "2026-11-05T02:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:05:00+09:00",
              "beijing": "2026-11-06T02:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 48,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 138,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmda_recall",
          "enabled": true,
          "line": 148
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "PMDA 医薬品/医療機器 回収",
      "source_url": "https://www.info.pmda.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 150,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 244,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmda_recall",
          "line": 148,
          "module_chain": [
            "backend.crawlers.sources.pmda_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "pmda_recall",
      "crawler": "backend/crawlers/sources/pmda_recall.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 138,
          "kind": "lookup_source_id",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "pmda_recall",
          "enabled": true,
          "line": 148
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "PMDA 医薬品/医療機器 回収",
      "source_url": "https://www.info.pmda.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 150,
          "origin": "online"
        },
        {
          "url": "https://www.info.pmda.go.jp/kaisyuu/rcidx{dynamic}-{dynamic}_all.zip",
          "symbol": "source_url",
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 244,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "pmda_recall",
          "line": 148,
          "module_chain": [
            "backend.crawlers.sources.pmda_recall"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "pmda_recall",
          "scheduler": "schedule.yaml",
          "cron": "0 7 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 07:00",
          "command": "python3 -m backend.crawlers.sources.pmda_recall",
          "modules": [
            "backend.crawlers.sources.pmda_recall"
          ],
          "selected_sources": [],
          "timeout_min_configured": 20,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T07:00:00+09:00",
              "beijing": "2026-11-04T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T07:00:00+09:00",
              "beijing": "2026-11-05T06:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T07:00:00+09:00",
              "beijing": "2026-11-06T06:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 148,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        8,
        10
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "tdnet",
      "crawler": "backend/crawlers/sources/tdnet.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 198,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "tdnet",
          "enabled": true,
          "line": 32
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        8,
        10
      ],
      "source_name": "TDnet 適時開示",
      "source_url": "https://www.release.tdnet.info/",
      "crawler_url_candidates": [
        {
          "url": "https://www.release.tdnet.info/inbs/I_list_{page:03d}_{ymd}.html",
          "symbol": "LIST_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 39,
          "origin": "online"
        },
        {
          "url": "https://www.release.tdnet.info/inbs/{pdf}",
          "symbol": "PDF_URL_TPL",
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 40,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "tdnet",
          "line": 32,
          "module_chain": [
            "backend.crawlers.sources.tdnet"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "tdnet",
          "scheduler": "schedule.yaml",
          "cron": "5,35 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 05、35 分",
          "command": "python3 -m backend.crawlers.sources.tdnet",
          "modules": [
            "backend.crawlers.sources.tdnet"
          ],
          "selected_sources": [],
          "timeout_min_configured": 15,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:05:00+09:00",
              "beijing": "2026-11-03T17:05:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:35:00+09:00",
              "beijing": "2026-11-03T17:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:05:00+09:00",
              "beijing": "2026-11-03T18:05:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 32,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "high_frequency"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/crawlers/sources/jgoodtech_profiles.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 34,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        2
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 35,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "nintei_shien_kikan",
      "crawler": "backend/crawlers/sources/nintei_shien_kikan.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "nintei_shien_kikan",
          "enabled": true,
          "line": 1128
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "認定経営革新等支援機関検索",
      "source_url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
      "crawler_url_candidates": [
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationList",
          "symbol": "SEARCH_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertificationArea",
          "symbol": "AREA_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://www.ninteishien.go.jp/NSK_CertifiedRecordView",
          "symbol": "DETAIL_URL",
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "nintei_shien_kikan",
          "line": 1128,
          "module_chain": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "crawler",
      "schedule_plans": [
        {
          "task": "nintei_shien_kikan",
          "scheduler": "schedule.yaml",
          "cron": "50 6 3 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 3 日 06:50",
          "command": "python3 -m backend.crawlers.sources.nintei_shien_kikan --skip-raw-s3 --detail-workers 6",
          "modules": [
            "backend.crawlers.sources.nintei_shien_kikan"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-03T06:50:00+09:00",
              "beijing": "2026-12-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-03T06:50:00+09:00",
              "beijing": "2027-01-03T05:50:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-03T06:50:00+09:00",
              "beijing": "2027-02-03T05:50:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1128,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "gbizinfo",
      "crawler": "backend/crawlers/sources/gbizinfo.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 41,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        1
      ],
      "source_name": "gBizINFO",
      "source_url": "https://info.gbiz.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://info.gbiz.go.jp/hojin/OutputCSV",
          "symbol": "OUTPUT_CSV",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://info.gbiz.go.jp/hojin/CsvDownload",
          "symbol": "REFERER",
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 37,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "crawler",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 274,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, 'J-GoodTech', 'J-GoodTech', 'business_matching',\n           'Organization for Small & Medium Enterprises and Regional Innovation, JAPAN',\n           %s, 'public_web', 'P2', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Public company profile API; import only fields exposed with publishCorp2=true.',\n             'terms_url', 'https://jgoodtech.smrj.go.jp/pub/ja/terms/'\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "jgoodtech",
      "crawler": "backend/scripts/import_jgoodtech_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 35,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "jgoodtech",
          "enabled": true,
          "line": 734
        }
      ],
      "table": "jgoodtech_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "jgoodtech_representative_done",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 217,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO jgoodtech_representative_done\n              (jgt_corp_mng_id, corporate_number, status, company_name, raw_name,\n               display_name, position, page_url, error, checked_at, updated_at)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, now(), now())\n            ON CONFLICT (jgt_corp_mng_id) DO UPDATE SET\n              corporate_number=EXCLUDED.corporate_number,\n              status=EXCLUDED.status,\n              company_name=EXCLUDED.company_name,\n              raw_name=EXCLUDED.raw_name,\n              display_name=EXCLUDED.display_name,\n              position=EXCLUDED.position,\n              page_url=EXCLUDED.page_url,\n              error=EXCLUDED.error,\n              checked_at=EXCLUDED.checked_at,\n              updated_at=now()\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "J-GoodTech 公開企業プロフィール",
      "source_url": "https://jgoodtech.smrj.go.jp",
      "crawler_url_candidates": [
        {
          "url": "https://jgoodtech.smrj.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 36,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/search/corp",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 37,
          "origin": "online"
        },
        {
          "url": "https://jgoodtech.smrj.go.jp/api/v1/corp-display",
          "symbol": "DETAIL_URL",
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 38,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "jgoodtech",
          "line": 734,
          "module_chain": [
            "backend.scripts.import_jgoodtech_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "jgoodtech",
          "scheduler": "schedule.yaml",
          "cron": "15 5 * * 2",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "weekly",
          "label": "每周三 05:15",
          "command": "python3 -m backend.scripts.import_jgoodtech_representatives --start-page 1 --pages 700 --page-size 100 --sleep 0.1 --apply",
          "modules": [
            "backend.scripts.import_jgoodtech_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:15:00+09:00",
              "beijing": "2026-11-04T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-11T05:15:00+09:00",
              "beijing": "2026-11-11T04:15:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-18T05:15:00+09:00",
              "beijing": "2026-11-18T04:15:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 734,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "weekly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    },
    {
      "source": "koeki_info_representatives",
      "crawler": "backend/scripts/import_koeki_info_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 44,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "koeki_info_representatives",
          "enabled": true,
          "line": 836
        }
      ],
      "table": "data_sources",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "data_sources",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 335,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n        INSERT INTO data_sources\n          (code, name_ja, name_en, category, authority, base_url, license_type,\n           priority, is_active, crawl_config, compliance_record)\n        VALUES\n          (%s, %s, %s, 'directory',\n           'Cabinet Office / prefectural governments', %s, 'public_html',\n           'P3', true, '{}'::jsonb,\n           jsonb_build_object(\n             'note', 'Official Koeki Hojin information detail pages. Corporate-number match requires unique normalized corporation name plus address.',\n             'source_page_url', %s::text\n           ))\n        ON CONFLICT (code) DO UPDATE SET\n          base_url=EXCLUDED.base_url,\n          compliance_record=data_sources.compliance_record || EXCLUDED.compliance_record,\n          updated_at=now()\n        RETURNING id\n        "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "公益法人information 公益法人等詳細",
      "source_url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
      "crawler_url_candidates": [
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/",
          "symbol": "BASE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 47,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 48,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "SOURCE_PAGE_URL",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 49,
          "origin": "online"
        },
        {
          "url": "https://www.koeki-info.go.jp/pictis-info/csa0001%21show",
          "symbol": "source_page_url",
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 415,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "koeki_info_representatives",
          "line": 836,
          "module_chain": [
            "backend.scripts.import_koeki_info_representatives"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "importer",
      "schedule_plans": [
        {
          "task": "koeki_info_representatives",
          "scheduler": "schedule.yaml",
          "cron": "30 5 9 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 9 日 05:30",
          "command": "python3 -m backend.scripts.import_koeki_info_representatives --start-page 1 --max-pages 6 --disp-number 100 --sleep 0.05 --apply",
          "modules": [
            "backend.scripts.import_koeki_info_representatives"
          ],
          "selected_sources": [],
          "timeout_min_configured": 120,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-09T05:30:00+09:00",
              "beijing": "2026-11-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-09T05:30:00+09:00",
              "beijing": "2026-12-09T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-09T05:30:00+09:00",
              "beijing": "2027-01-09T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 836,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "monthly"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "来源登记元数据"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "reinfolib",
      "crawler": "backend/scripts/reinfolib_incremental.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "kind": "scheduler_source_binding",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "reinfolib",
          "enabled": true,
          "line": 1075
        }
      ],
      "table": "raw_documents",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 119,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        INSERT INTO raw_documents (\n            source_id, source_record_id, url, url_hash, content_hash,\n            content_type, s3_bucket, s3_key, http_status, bytes_size,\n            fetched_at, job_id, parsed, meta\n        ) VALUES (\n            %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, FALSE, %s::jsonb\n        )\n        ON CONFLICT (source_id, content_hash, fetched_at) DO NOTHING\n        RETURNING id\n    "
        },
        {
          "table": "raw_documents",
          "file": "backend/crawlers/storage.py",
          "line": 206,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
        }
      ],
      "dimensions": [
        11
      ],
      "source_name": "不動産情報ライブラリ",
      "source_url": "https://www.reinfolib.mlit.go.jp/",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "reinfolib",
          "line": 1075,
          "module_chain": [
            "backend.scripts.reinfolib_incremental"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "reinfolib",
          "scheduler": "schedule.yaml",
          "cron": "10 18 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 18:10",
          "command": "python3 -m backend.scripts.reinfolib_incremental --mode daily --workers 3",
          "modules": [
            "backend.scripts.reinfolib_incremental"
          ],
          "selected_sources": [],
          "timeout_min_configured": 180,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T18:10:00+09:00",
              "beijing": "2026-11-03T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T18:10:00+09:00",
              "beijing": "2026-11-04T17:10:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T18:10:00+09:00",
              "beijing": "2026-11-05T17:10:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 1075,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "原文归档／解析状态"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "entity_resolution_cache",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "entity_resolution_cache",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 657,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO entity_resolution_cache\n              (raw_name, raw_address, raw_context, resolved_corporate_number,\n               confidence, method)\n            VALUES (%s, '', %s, %s, %s, %s)\n            ON CONFLICT (raw_name, raw_address) DO NOTHING\n            "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "实体匹配缓存"
    },
    {
      "source": "courts_hanrei",
      "crawler": "backend/scripts/parse_courts_hanrei_pdfs.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 48,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "enabled": true,
          "line": 79
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例検索",
      "source_url": "https://www.courts.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.courts.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 51,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "same_hostname_as_registry",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "courts_hanrei_pdf_parse",
          "line": 79,
          "module_chain": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        },
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "courts_hanrei_pdf_parse",
          "scheduler": "schedule.yaml",
          "cron": "35 5 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 05:35",
          "command": "python3 -m backend.scripts.parse_courts_hanrei_pdfs --limit 500 --workers 2 --rps 0.5 --timeout 45 --order newest",
          "modules": [
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T05:35:00+09:00",
              "beijing": "2026-11-04T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T05:35:00+09:00",
              "beijing": "2026-11-05T04:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T05:35:00+09:00",
              "beijing": "2026-11-06T04:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 79,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        },
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "static_reference",
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job",
            "backend.scripts.backfill_court_case_intelligence",
            "backend.scripts.parse_courts_hanrei_pdfs"
          ],
          "association_note": "父任务静态引用此模块/函数；不代表该 crawler 的完整入口每周期都运行"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "court_case_intelligence",
      "crawler": "backend/scripts/run_court_case_intelligence_job.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 18,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [
        {
          "task": "court_case_intelligence",
          "enabled": true,
          "line": 85
        }
      ],
      "table": "crawl_jobs",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 152,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
        },
        {
          "table": "crawl_jobs",
          "file": "backend/crawlers/storage.py",
          "line": 169,
          "origin": "online",
          "kind": "called_helper_sql",
          "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
        }
      ],
      "dimensions": [
        10
      ],
      "source_name": "裁判所判例 司法・訴訟インテリジェンス",
      "source_url": "https://www.courts.go.jp/app/hanrei_jp/search1",
      "crawler_url_candidates": [],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [
        {
          "task": "court_case_intelligence",
          "line": 85,
          "module_chain": [
            "backend.scripts.run_court_case_intelligence_job"
          ]
        }
      ],
      "schedule_state": "enabled_direct",
      "program_kind": "batch_or_parser",
      "schedule_plans": [
        {
          "task": "court_case_intelligence",
          "scheduler": "schedule.yaml",
          "cron": "35 6 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 06:35",
          "command": "python3 -m backend.scripts.run_court_case_intelligence_job --limit 5000 --select-batch-size 1000 --batch-size 200 --progress-every 500 --min-facts 54500 --sample-limit 10 --timeout-min 75",
          "modules": [
            "backend.scripts.run_court_case_intelligence_job"
          ],
          "selected_sources": [],
          "timeout_min_configured": 90,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T06:35:00+09:00",
              "beijing": "2026-11-04T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T06:35:00+09:00",
              "beijing": "2026-11-05T05:35:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T06:35:00+09:00",
              "beijing": "2026-11-06T05:35:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 85,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "此程序是配置中的直接启动入口"
        }
      ],
      "schedule_cycle_categories": [
        "daily"
      ],
      "schedule_coverage": "direct_enabled",
      "schedule_coverage_note": "有启用的直接调度计划",
      "relationship_kind": "auxiliary_write",
      "table_role": "爬虫执行记录"
    },
    {
      "source": "geps",
      "crawler": "backend/scripts/backfill_geps_representatives.py",
      "crawler_origin": "online",
      "source_evidence": [
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 37,
          "kind": "source_code_assignment",
          "origin": "online"
        }
      ],
      "jobs": [],
      "table": "geps_representative_done",
      "status": "confirmed_code",
      "table_evidence": [
        {
          "table": "geps_representative_done",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 280,
          "origin": "online",
          "kind": "sql_write",
          "sql": "\n            INSERT INTO geps_representative_done\n              (corporate_number, status, company_name, raw_name, display_name,\n               position, error, checked_at, updated_at)\n            VALUES (%s, %s, %s, %s, %s, %s, %s, now(), now())\n            ON CONFLICT (corporate_number) DO UPDATE SET\n              status=EXCLUDED.status,\n              company_name=EXCLUDED.company_name,\n              raw_name=EXCLUDED.raw_name,\n              display_name=EXCLUDED.display_name,\n              position=EXCLUDED.position,\n              error=EXCLUDED.error,\n              checked_at=EXCLUDED.checked_at,\n              updated_at=now()\n            "
        }
      ],
      "dimensions": [
        5
      ],
      "source_name": "電子調達 GEPS",
      "source_url": "https://www.geps.go.jp/",
      "crawler_url_candidates": [
        {
          "url": "https://www.p-portal.go.jp",
          "symbol": "BASE",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 40,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0101",
          "symbol": "SEARCH_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 41,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0100",
          "symbol": "SEARCH_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 42,
          "origin": "online"
        },
        {
          "url": "https://www.p-portal.go.jp/pps-web-biz/UAB01/OAB0108",
          "symbol": "DETAIL_POST_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 43,
          "origin": "online"
        },
        {
          "url": "https://api.p-portal.go.jp/pps-web-biz/UAB03/OAB0301",
          "symbol": "BID_ZIP_URL",
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 44,
          "origin": "online"
        }
      ],
      "crawler_url_scope": "single_source_module",
      "field_scope_by_dimension": {},
      "enabled_schedule_paths": [],
      "schedule_state": "no_enabled_reference_found",
      "program_kind": "backfill",
      "schedule_plans": [],
      "schedule_cycle_categories": [],
      "schedule_coverage": "no_plan_found",
      "schedule_coverage_note": "未找到直接调度计划；可能手工执行或由其他编排调用",
      "relationship_kind": "auxiliary_write",
      "table_role": "处理完成标记／检查点"
    }
  ],
  "processing_pipelines": [
    {
      "id": "c78c11ae0abd",
      "processor": "backend/scripts/build_address_clusters.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "address_clusters",
        "companies",
        "virtual_office_locations"
      ],
      "outputs": [
        "address_clusters"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 319,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "virtual_office_locations": [
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 329,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "address_clusters": [
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 349,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "address_clusters": [
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 391,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        3
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/build_address_clusters.py",
      "schedule_plans": [],
      "output_roles": {
        "address_clusters": "派生／聚合结果"
      },
      "description": {
        "summary": "在同一町丁目番地内结合规范楼名、房号与虚拟办公室证据聚类地址，生成企业地址簇。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "同 chome-banchi 内基于多证据规则把 building 字符串聚类。",
        "evidence": [
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 141,
            "symbol": "extract_room",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 302,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 61,
            "symbol": "__init__",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 64,
            "symbol": "find",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 76,
            "symbol": "union",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 81,
            "symbol": "groups",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 100,
            "symbol": "canonical_street",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 113,
            "symbol": "name_without_room",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 118,
            "symbol": "longest_common_substring_len",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_address_clusters.py",
            "line": 136,
            "symbol": "is_room_only",
            "origin": "online"
          }
        ],
        "code_sha256": "030c8b0a9258b94faec4323a2855dc7618a20a18852f4e7b9c192b68382e2334",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "24d6270e2f53",
      "processor": "backend/scripts/merge_address_clusters_v2.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "address_clusters",
        "companies"
      ],
      "outputs": [
        "address_clusters",
        "companies"
      ],
      "input_evidence": {
        "address_clusters": [
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 408,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 463,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 366,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 384,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "address_clusters": [
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 392,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 411,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        3
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/merge_address_clusters_v2.py",
      "schedule_plans": [],
      "output_roles": {
        "address_clusters": "派生／聚合结果",
        "companies": "派生／聚合结果"
      },
      "description": {
        "summary": "在同一地址范围内按去楼层房号后的楼名主干合并碎片地址簇，并更新企业簇引用，保留原簇。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "address_clusters 二级聚类 (v2): 合并\"同楼不同层/不同房号\"的碎片化 cluster。",
        "evidence": [
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 141,
            "symbol": "building_match_key",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 427,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 102,
            "symbol": "canonical_street_key",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 121,
            "symbol": "building_stem",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 149,
            "symbol": "__init__",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 152,
            "symbol": "find",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 163,
            "symbol": "union",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 168,
            "symbol": "groups",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 175,
            "symbol": "plan_merges_for_chome",
            "origin": "online"
          },
          {
            "file": "backend/scripts/merge_address_clusters_v2.py",
            "line": 309,
            "symbol": "ensure_migration",
            "origin": "online"
          }
        ],
        "code_sha256": "c5773e75bc8d3b71f1e340a08d652e2e01f33d436389231790fde25bd651ce4e",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "5fd0ef6889da",
      "processor": "backend/scripts/build_business_scope.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "business_licenses",
        "certifications",
        "company_business_scope",
        "company_industry_inferred",
        "company_relationships",
        "company_subpage_data",
        "company_website_data",
        "construction_licenses",
        "government_contracts",
        "professionals",
        "workforce_disclosures"
      ],
      "outputs": [
        "company_business_scope",
        "company_industry_inferred"
      ],
      "input_evidence": {
        "company_business_scope": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 772,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "construction_licenses": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 377,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "business_licenses": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 443,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "professionals": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 493,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "certifications": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 513,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_website_data": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 603,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 636,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_subpage_data": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 673,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "government_contracts": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 708,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_industry_inferred": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 731,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 875,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "workforce_disclosures": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 568,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_relationships": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 586,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_business_scope": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 346,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "company_industry_inferred": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 778,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 859,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 899,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        2
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/build_business_scope.py",
      "schedule_plans": [],
      "output_roles": {
        "company_business_scope": "派生／聚合结果",
        "company_industry_inferred": "派生／聚合结果"
      },
      "description": {
        "summary": "汇总许可、设施、职业及业务文本，形成业务范围证据台账，并聚合为 JSIC 中分类行业信号。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Build company_business_scope evidence ledger + aggregate to company_industry_inferred.industry_jsic_mid.",
        "evidence": [
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 311,
            "symbol": "match_jsic_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 321,
            "symbol": "extract_codes_from_freetext",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 923,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 334,
            "symbol": "stable_source_row_id",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 364,
            "symbol": "_exec_many",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 373,
            "symbol": "populate_construction",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 408,
            "symbol": "populate_simple_permit_table",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 438,
            "symbol": "populate_business_licenses",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 488,
            "symbol": "populate_professionals",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_scope.py",
            "line": 509,
            "symbol": "populate_certifications",
            "origin": "online"
          }
        ],
        "code_sha256": "7e45b52c6de714102c4b1748c4c084c270e0d7cb56f7cae35f7a578894c1f038",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "c8f6815adab8",
      "processor": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "business_licenses",
        "company_industry_inferred",
        "data_sources"
      ],
      "outputs": [
        "company_industry_inferred",
        "field_lineage"
      ],
      "input_evidence": {
        "business_licenses": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 54,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 55,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_industry_inferred": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 138,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 140,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 154,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 156,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_industry_inferred": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 60,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "company_industry_inferred",
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 60,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\nWITH eligible AS (\n    SELECT DISTINCT bl.corporate_number\n    FROM business_licenses bl\n    JOIN data_sources ds ON ds.id = bl.source_id\n    WHERE ds.code = %(source_code)s\n      AND bl.corporate_number IS NOT NULL\n      AND bl.license_type = 'industrial_waste_disposal'\n)\nINSERT INTO company_industry_inferred AS cii\n       (corporate_number, industry_code, industry_name,\n        industry_jsic_mid, industry_signals, confidence,\n        inferred_at, updated_at)\nSELECT e.corporate_number,\n       %(mid_code)s::varchar(16),\n       %(mid_name)s::varchar(255),\n       ARRAY[%(mid_code)s]::text[],\n       jsonb_build_object(%(mid_code)s::text, jsonb_build_array(%(source_kind)s::text)),\n       %(conf)s::numeric,\n       now(), now()\nFROM eligible e\nON CONFLICT (corporate_number) DO UPDATE\nSET industry_jsic_mid =\n        CASE WHEN cii.industry_jsic_mid IS NULL\n             THEN ARRAY[%(mid_code)s]::text[]\n             WHEN %(mid_code)s = ANY(cii.industry_jsic_mid)\n             THEN cii.industry_j"
          }
        ],
        "field_lineage": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 104,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "field_lineage",
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 104,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\nINSERT INTO field_lineage\n       (table_name, column_name, source_code, parser_module,\n        parser_function, description, parser_version, last_written_at)\nVALUES\n       ('company_industry_inferred', 'industry_jsic_mid',\n        %(src)s,\n        'backend.scripts.backfill_industry_from_env_sanpai',\n        'main',\n        '産廃情報ネット (環境省) 産業廃棄物処理業者 → JSIC mid=88 (廃棄物処理業). '\n        '通过 business_licenses[license_type=industrial_waste_disposal] join; '\n        'confidence=1.00 (法定許可); idempotent merge into industry_jsic_mid + industry_signals.',\n        'v1',\n        now())\nON CONFLICT (table_name, column_name) DO UPDATE\nSET source_code     = EXCLUDED.source_code,\n    parser_module   = EXCLUDED.parser_module,\n    parser_function = EXCLUDED.parser_function,\n    description     = EXCLUDED.description,\n    parser_version  = EXCLUDED.parser_version,\n    last_written_at = now()\n"
          }
        ]
      },
      "dimensions": [
        2
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_industry_from_env_sanpai.py",
      "schedule_plans": [],
      "output_roles": {
        "company_industry_inferred": "派生／聚合结果",
        "field_lineage": "字段溯源元数据"
      },
      "description": {
        "summary": "依据产业废弃物处理许可，将相关企业的行业信号合并到推断行业数据。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "env_sanpai (産業廃棄物処理業 許可) → company_industry_inferred 增量聚合.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
            "line": 127,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "57b23a9f2db81a02059c46185ac571b38ada090535f1e972ad976544eda92938",
        "sources": [
          "env_sanpai"
        ],
        "business_outputs": [
          "company_industry_inferred"
        ],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "a844384751c1",
      "processor": "backend/scripts/compliance_check_runner.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "compliance_check_evidence",
        "compliance_check_targets",
        "data_sources",
        "risk_events"
      ],
      "outputs": [
        "compliance_check_batches",
        "compliance_check_evidence",
        "compliance_check_targets"
      ],
      "input_evidence": {
        "risk_events": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 271,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 347,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 272,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 348,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "compliance_check_targets": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 384,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 594,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "compliance_check_evidence": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 520,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "compliance_check_targets": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 568,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 454,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "compliance_check_batches": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 601,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 423,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "compliance_check_evidence": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 508,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/compliance_check_runner.py",
      "schedule_plans": [],
      "output_roles": {
        "compliance_check_batches": "派生／聚合结果",
        "compliance_check_evidence": "派生／聚合结果",
        "compliance_check_targets": "派生／聚合结果"
      },
      "description": {
        "summary": "针对待查企业或人员建立合规核查批次，从已有风险事件召回候选证据，保存可复核的匹配记录。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Run a minimal compliance-check workflow over existing risk_events.",
        "evidence": [
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 209,
            "symbol": "classify_match_reason",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 451,
            "symbol": "insert_target",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 485,
            "symbol": "insert_evidence",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 652,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 739,
            "symbol": "build_arg_parser",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 761,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 93,
            "symbol": "split_words",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 110,
            "symbol": "clean_corporate_number",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 117,
            "symbol": "normalize_target_type",
            "origin": "online"
          },
          {
            "file": "backend/scripts/compliance_check_runner.py",
            "line": 123,
            "symbol": "load_targets_from_csv",
            "origin": "online"
          }
        ],
        "code_sha256": "256f96d7be8069de4bb1b04e7cce59dd4e7830103153846b560fb3dbfe9ba578",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "991c60370bd7",
      "processor": "backend/scripts/backfill_political_donation_corporate_numbers.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "political_donations"
      ],
      "outputs": [
        "political_donations"
      ],
      "input_evidence": {
        "political_donations": [
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 540,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 321,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 346,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "political_donations": [
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 571,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        8
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_political_donation_corporate_numbers.py",
      "schedule_plans": [],
      "output_roles": {
        "political_donations": "派生／聚合结果"
      },
      "description": {
        "summary": "清洗政治献金原始名称，保守匹配企业并回填 political_donations 的法人编号；默认试运行，对歧义或低置信结果只报告。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill corporate numbers on political donation rows.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 2,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 244,
            "symbol": "extract_company_phrases_from_text",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 270,
            "symbol": "extract_company_phrases",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 537,
            "symbol": "fetch_rows",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 599,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 183,
            "symbol": "load_env",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 197,
            "symbol": "normalize_width",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 204,
            "symbol": "normalize_company_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 211,
            "symbol": "legal_form_of",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 216,
            "symbol": "company_body",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
            "line": 220,
            "symbol": "name_variants",
            "origin": "online"
          }
        ],
        "code_sha256": "bdaa4a5cdefbbaaf5175673008fbd8bef0dbf863f41cb17c6ecada274c0239ce",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "83c31cea59ab",
      "processor": "backend/scripts/recompute_address_share_count.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies"
      ],
      "outputs": [
        "companies"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/recompute_address_share_count.py",
            "line": 31,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/recompute_address_share_count.py",
            "line": 42,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/recompute_address_share_count.py",
            "line": 51,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        3
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/recompute_address_share_count.py",
      "schedule_plans": [],
      "output_roles": {
        "companies": "派生／聚合结果"
      },
      "description": {
        "summary": "按规范后的都道府县、市区、番地和楼宇组合重算同址企业数量。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "companies.address_share_count を building 拆分後の住所粒度で再計算。",
        "evidence": [
          {
            "file": "backend/scripts/recompute_address_share_count.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/recompute_address_share_count.py",
            "line": 65,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "3905dace47ef85909e692d883a4bda7e5b9806618e91bf1e108e489030c1f467",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "d4ccda848510",
      "processor": "backend/scripts/build_business_model_v2.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "awards",
        "care_facilities",
        "companies",
        "construction_licenses",
        "food_business_licenses",
        "government_contracts",
        "hotel_ryokan_registry",
        "intellectual_properties",
        "medical_facilities",
        "school_institution"
      ],
      "outputs": [
        "company_business_model"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 132,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "government_contracts": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 139,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "intellectual_properties": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 140,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "construction_licenses": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 141,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "awards": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 142,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "medical_facilities": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 144,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "care_facilities": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 145,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "hotel_ryokan_registry": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 146,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "school_institution": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 147,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "food_business_licenses": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 148,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_business_model": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 264,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        2
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/build_business_model_v2.py",
      "schedule_plans": [],
      "output_roles": {
        "company_business_model": "派生／聚合结果"
      },
      "description": {
        "summary": "聚合已有业务证据并计算 B2B、B2C 得分，生成控股、B2B、B2C、混合或未知业务模式及置信度。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Build company_business_model v2 — fix the 2026-05-13 broken classifier.",
        "evidence": [
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 158,
            "symbol": "classify_one",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 278,
            "symbol": "run_shard",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 355,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v2.py",
            "line": 335,
            "symbol": "smoke_test",
            "origin": "online"
          }
        ],
        "code_sha256": "d1b45a51283e4488ab0685dbff8266321d4d8a210f0f94ccd0a345e94016a483",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "11fbadb237ff",
      "processor": "backend/scripts/backfill_court_case_intelligence.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "court_case_facts",
        "court_hanrei_pdf_parses",
        "data_sources",
        "risk_events"
      ],
      "outputs": [
        "court_hanrei_pdf_parses",
        "risk_events"
      ],
      "input_evidence": {
        "court_hanrei_pdf_parses": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 52,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "risk_events": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 53,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 55,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "court_case_facts": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 56,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "court_hanrei_pdf_parses": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 128,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "risk_events": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 143,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_court_case_intelligence.py",
      "schedule_plans": [],
      "output_roles": {
        "court_hanrei_pdf_parses": "派生／聚合结果",
        "risk_events": "派生／聚合结果"
      },
      "description": {
        "summary": "复用已解析判决 PDF 的结构化记录，生成案件事实、法官和企业关联等索引，避免重复下载文书。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill structured court case facts from existing hanrei PDF parses.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 159,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 33,
            "symbol": "db_conn",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 37,
            "symbol": "select_rows",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 67,
            "symbol": "backfill_row",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_court_case_intelligence.py",
            "line": 188,
            "symbol": "process_rows",
            "origin": "online"
          }
        ],
        "code_sha256": "d980d0122fbfb2ec7d393fc203b9e6225c32688a271abccb44016fa93bfbb7e0",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "a9807cae7bf5",
      "processor": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "data_sources",
        "kanpo_notices",
        "kanpo_source_records"
      ],
      "outputs": [
        "kanpo_downstream_links",
        "raw_documents",
        "risk_events"
      ],
      "input_evidence": {
        "kanpo_notices": [
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 182,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "kanpo_source_records": [
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 185,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 196,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "kanpo_downstream_links": [
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 219,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "kanpo_downstream_links",
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 219,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\n        INSERT INTO kanpo_downstream_links (\n            notice_id, source_record_id, target_table, target_id,\n            target_partition_date, derivation_type, parser_version, inputs\n        ) VALUES (\n            %s, %s, 'risk_events', %s,\n            %s, 'risk_event_upsert', %s, %s\n        )\n        ON CONFLICT (notice_id, target_table, target_id, target_partition_date)\n        DO UPDATE SET\n            source_record_id = COALESCE(EXCLUDED.source_record_id, kanpo_downstream_links.source_record_id),\n            parser_version = EXCLUDED.parser_version,\n            inputs = kanpo_downstream_links.inputs || EXCLUDED.inputs\n        "
          }
        ],
        "risk_events": [
          {
            "table": "risk_events",
            "file": "backend/crawlers/storage.py",
            "line": 281,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n        UPDATE risk_events\n           SET body = %(body)s,\n               body_extracted = %(body_extracted)s::jsonb,\n               fetched_at = %(fetched_at)s,\n               raw_doc_id = COALESCE(%(raw_doc_id)s, raw_doc_id),\n               parser_version = %(parser_version)s,\n               corporate_number = COALESCE(%(corporate_number)s, corporate_number),\n               match_confidence = COALESCE(%(match_confidence)s, match_confidence),\n               extraction_method = COALESCE(%(extraction_method)s, extraction_method),\n               subcategory = COALESCE(%(subcategory)s, subcategory),\n               severity = %(severity)s,\n               source_url = %(source_url)s,\n               effective_from = COALESCE(%(effective_from)s, effective_from),\n               effective_to = COALESCE(%(effective_to)s, effective_to)\n         WHERE id = %(_id)s AND event_date = %(_event_date)s\n    "
          },
          {
            "table": "risk_events",
            "file": "backend/crawlers/storage.py",
            "line": 299,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n        INSERT INTO risk_events (\n            corporate_number, match_confidence, extraction_method,\n            category, subcategory, severity,\n            title, body, body_extracted, authority,\n            event_date, effective_from, effective_to,\n            pdf_attachments, pdf_processing_status,\n            source_id, source_url, raw_doc_id, fetched_at, parser_version,\n            is_published_by_authority, display_policy, narrative_form\n        ) VALUES (\n            %(corporate_number)s, %(match_confidence)s, %(extraction_method)s,\n            %(category)s, %(subcategory)s, %(severity)s,\n            %(title)s, %(body)s, %(body_extracted)s::jsonb, %(authority)s,\n            %(event_date)s, %(effective_from)s, %(effective_to)s,\n            %(pdf_attachments)s, %(pdf_processing_status)s,\n            %(source_id)s, %(source_url)s, %(raw_doc_id)s, %(fetched_at)s, %(parser_version)s,\n            %(is_published_by_authority)s, %(display_policy)s, %(narrative_form)s\n        )\n       "
          }
        ],
        "raw_documents": [
          {
            "table": "raw_documents",
            "file": "backend/crawlers/storage.py",
            "line": 206,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n        UPDATE raw_documents\n           SET parsed = TRUE, parsed_at = now(), parser_version = %s\n         WHERE id = %s AND fetched_at = %s\n    "
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
      "schedule_plans": [],
      "output_roles": {
        "kanpo_downstream_links": "官报派生结果关联",
        "raw_documents": "原文归档／解析状态",
        "risk_events": "派生／聚合结果"
      },
      "description": {
        "summary": "将官报破产相关目录或公告页转为风险证据并登记下游关联；未识别债务人时仅保留页级推断，不能当作企业破产事实。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill Kanpo insolvency notice pages into risk_events.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 50,
            "symbol": "classify_kanpo_risk_kind",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 84,
            "symbol": "build_body_extracted",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 209,
            "symbol": "insert_downstream_link",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 251,
            "symbol": "parse_date_arg",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 257,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 317,
            "symbol": "parse_args",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 333,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 42,
            "symbol": "iso",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 59,
            "symbol": "best_source_url",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
            "line": 72,
            "symbol": "build_body",
            "origin": "online"
          }
        ],
        "code_sha256": "db4295d76b339d16b5f85a44334584b82601523685b89be154822418cce2be91",
        "sources": [
          "kanpo_official"
        ],
        "business_outputs": [
          "risk_events"
        ],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "f3742d4ea776",
      "processor": "backend/scripts/match_virtual_offices.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "companies_virtual_office_match",
        "virtual_office_locations"
      ],
      "outputs": [
        "companies_virtual_office_match"
      ],
      "input_evidence": {
        "virtual_office_locations": [
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 114,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 180,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 121,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 162,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 223,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 244,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies_virtual_office_match": [
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 158,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 230,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 254,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 267,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 285,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies_virtual_office_match": [
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 126,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 168,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 208,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        3
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/match_virtual_offices.py",
      "schedule_plans": [],
      "output_roles": {
        "companies_virtual_office_match": "派生／聚合结果"
      },
      "description": {
        "summary": "将企业地址热点与运营商网点按地址和楼名匹配，保存虚拟办公室候选关联及置信度。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "match_virtual_offices — virtual_office_locations と companies の hot-spot を交叉验证.",
        "evidence": [
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 274,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/match_virtual_offices.py",
            "line": 330,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "2bd9619b2024fa7317d51de0e2bb2fd294c74c9c57e2b4d78d296d04fe9f948c",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "066e5553614b",
      "processor": "backend/scripts/backfill_business_purpose_from_website.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "company_business_purpose",
        "company_website_data"
      ],
      "outputs": [
        "company_business_purpose"
      ],
      "input_evidence": {
        "company_business_purpose": [
          {
            "file": "backend/scripts/backfill_business_purpose_from_website.py",
            "line": 26,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_website_data": [
          {
            "file": "backend/scripts/backfill_business_purpose_from_website.py",
            "line": 54,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_business_purpose": [
          {
            "file": "backend/scripts/backfill_business_purpose_from_website.py",
            "line": 31,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        2
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_business_purpose_from_website.py",
      "schedule_plans": [],
      "output_roles": {
        "company_business_purpose": "派生／聚合结果"
      },
      "description": {
        "summary": "复用企业官网已保存的业务描述，补全业务内容表，并标记为官网证据以区别 EDINET 披露。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill company_business_purpose from company-owned website evidence.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_business_purpose_from_website.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_business_purpose_from_website.py",
            "line": 66,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "8ffe5663624d2c9862c14898e09b8e279983d4dd119a1ede0eac46f4a98dfba2",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "90f385ec9165",
      "processor": "backend/scripts/build_virtual_orgs.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "professionals"
      ],
      "outputs": [
        "professionals",
        "virtual_organizations"
      ],
      "input_evidence": {
        "professionals": [
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 291,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 212,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 406,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "virtual_organizations": [
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 360,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "professionals": [
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 379,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        6
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/build_virtual_orgs.py",
      "schedule_plans": [],
      "output_roles": {
        "professionals": "派生／聚合结果",
        "virtual_organizations": "派生／聚合结果"
      },
      "description": {
        "summary": "按专业人士的事务所名称、职业类别和都道府县聚合 virtual_organizations，并为符合条件且尚未关联的 professionals 回填组织ID；这是人员／事务所聚合，不直接证明工商集团关系。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "build_virtual_orgs.py — 由 professionals 重建 virtual_organizations 聚合表 (D1-D5 SAFE 版)",
        "evidence": [
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 167,
            "symbol": "extract_pref_city",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 286,
            "symbol": "fetch_candidates",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 385,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 451,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 138,
            "symbol": "strip_name_suffix",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 152,
            "symbol": "normalize_office_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 161,
            "symbol": "strip_postcode",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 208,
            "symbol": "load_city_to_pref",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 237,
            "symbol": "_self_audit",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_virtual_orgs.py",
            "line": 324,
            "symbol": "aggregate",
            "origin": "online"
          }
        ],
        "code_sha256": "f375e27f61b93b37e9c8aa925f60d43c2df72faa4770159c8536f271cf4cceed",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "ae789eb03edf",
      "processor": "backend/scripts/enqueue_legal_registry_requests.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "legal_registry_requests",
        "officers"
      ],
      "outputs": [
        "legal_registry_requests"
      ],
      "input_evidence": {
        "officers": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 48,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "legal_registry_requests": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 56,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 222,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 89,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "legal_registry_requests": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 176,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/enqueue_legal_registry_requests.py",
      "schedule_plans": [],
      "output_roles": {
        "legal_registry_requests": "派生／聚合结果"
      },
      "description": {
        "summary": "依据企业和现有任职关系筛选需要补充商业登记的对象，创建或更新 legal_registry_requests 请求队列；队列写入不等于已取得登记资料。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Queue companies that still need authorized commercial-registry retrieval.",
        "evidence": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 173,
            "symbol": "insert_requests",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 257,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 31,
            "symbol": "build_candidate_cte",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 145,
            "symbol": "preview",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests.py",
            "line": 236,
            "symbol": "print_rows",
            "origin": "online"
          }
        ],
        "code_sha256": "0a9a3af8a95e2a99733a1115cee1f3710dc0a1a7d36eebb4912c54057cc2aa1c",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "ebbd5d6f6d38",
      "processor": "backend/scripts/derive_risk_score.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "risk_events"
      ],
      "outputs": [
        "companies"
      ],
      "input_evidence": {
        "risk_events": [
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 84,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 116,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 124,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 251,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 252,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 253,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 121,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 254,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 266,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 92,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 104,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 113,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/derive_risk_score.py",
      "schedule_plans": [
        {
          "task": "risk_score_derived",
          "scheduler": "schedule.yaml",
          "cron": "0 4 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:00",
          "command": "python3 -m backend.scripts.derive_risk_score",
          "modules": [
            "backend.scripts.derive_risk_score"
          ],
          "selected_sources": [],
          "timeout_min_configured": 60,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:00:00+09:00",
              "beijing": "2026-11-04T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:00:00+09:00",
              "beijing": "2026-11-05T03:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:00:00+09:00",
              "beijing": "2026-11-06T03:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 293,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "companies": "派生／聚合结果"
      },
      "description": {
        "summary": "按企业风险事件严重度、时间衰减和有效期聚合风险分数；这是规则计算结果。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Derive `companies.risk_score` from `risk_events` aggregation.",
        "evidence": [
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 129,
            "symbol": "run_tests",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 150,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 63,
            "symbol": "decay",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_risk_score.py",
            "line": 71,
            "symbol": "compute_score",
            "origin": "online"
          }
        ],
        "code_sha256": "5364ec9781d0f29d18e7bb0f7065dea5731880a81a9a67412e1134f36949333d",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "4505372b8c19",
      "processor": "backend/scripts/derive_paper_co_flag.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "certifications",
        "companies",
        "company_paper_co_flag",
        "government_contracts",
        "intellectual_properties",
        "invoice_registrants",
        "news_mentions",
        "officers"
      ],
      "outputs": [
        "company_paper_co_flag"
      ],
      "input_evidence": {
        "officers": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 189,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "invoice_registrants": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 196,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "intellectual_properties": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 203,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "government_contracts": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 209,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "news_mentions": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 215,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "certifications": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 221,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 330,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 441,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 291,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_paper_co_flag": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 377,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 485,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 547,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 839,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 849,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 859,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_paper_co_flag": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 443,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 480,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/derive_paper_co_flag.py",
      "schedule_plans": [],
      "output_roles": {
        "company_paper_co_flag": "派生／聚合结果"
      },
      "description": {
        "summary": "结合地址共享程度、成立时间及经营活动证据计算纸面公司线索评分和标记，结果属于规则推断。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Recompute `company_paper_co_flag` from current evidence (low-impact).",
        "evidence": [
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 118,
            "symbol": "run_unit_tests",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 355,
            "symbol": "dry_run_sample",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 645,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 76,
            "symbol": "addr_pts",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 87,
            "symbol": "young_pts",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 93,
            "symbol": "compute_paper_co_score",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 156,
            "symbol": "_validate_mem",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 164,
            "symbol": "session_guards_sql",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 268,
            "symbol": "_shard_predicate",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_paper_co_flag.py",
            "line": 303,
            "symbol": "apply_session_guards",
            "origin": "online"
          }
        ],
        "code_sha256": "9a4ca1191cad84cf45ad5117d38f7b1e156dfea13a80da4afce9b44cd732d44c",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "d651ca2f9a26",
      "processor": "backend/scripts/backfill_establishment_from_website.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "company_website_data"
      ],
      "outputs": [
        "companies"
      ],
      "input_evidence": {
        "company_website_data": [
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 96,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 97,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 171,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 140,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        7
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_establishment_from_website.py",
      "schedule_plans": [],
      "output_roles": {
        "companies": "派生／聚合结果"
      },
      "description": {
        "summary": "将企业官网采集的自由文本成立日期标准化；不确定月份或日期使用约定占位，需保留精度边界。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Stream B: Normalize company_website_data.founded_date_raw → establishment_date.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 49,
            "symbol": "parse_founded_date",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 91,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_website.py",
            "line": 42,
            "symbol": "_normalize_text",
            "origin": "online"
          }
        ],
        "code_sha256": "e80b6370b56d1fa23661ecfd5661a6c5c2382a570d182becc06c26ba5242a2f0",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "e3e2220cda7e",
      "processor": "backend/scripts/backfill_establishment_from_edinet.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "edinet_filings"
      ],
      "outputs": [
        "companies",
        "crawl_jobs"
      ],
      "input_evidence": {
        "edinet_filings": [
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 319,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 278,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 292,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 303,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 482,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 492,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 374,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 331,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "companies",
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 331,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\nUPDATE companies\n   SET establishment_date   = %s,\n       establishment_source = 'edinet_xbrl'\n WHERE corporate_number = %s\n   AND (establishment_source IS NULL\n        OR establishment_source IN ('nta_post_2015', 'website')\n        OR (establishment_source = 'edinet_xbrl' AND establishment_date IS DISTINCT FROM %s))\n"
          }
        ],
        "crawl_jobs": [
          {
            "table": "crawl_jobs",
            "file": "backend/crawlers/storage.py",
            "line": 152,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
          },
          {
            "table": "crawl_jobs",
            "file": "backend/crawlers/storage.py",
            "line": 169,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
          }
        ]
      },
      "dimensions": [
        7
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_establishment_from_edinet.py",
      "schedule_plans": [
        {
          "task": "tyc-establishment-edinet.timer",
          "scheduler": "systemd.timer",
          "calendar": "*-*-* 04:30:00 UTC",
          "timezone": "UTC",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 04:30 UTC",
          "command": "/usr/bin/python3 -m backend.scripts.backfill_establishment_from_edinet --incremental",
          "modules": [
            "backend.scripts.backfill_establishment_from_edinet"
          ],
          "selected_sources": [],
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T04:30:00+00:00",
              "beijing": "2026-11-04T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T04:30:00+00:00",
              "beijing": "2026-11-05T12:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T04:30:00+00:00",
              "beijing": "2026-11-06T12:30:00+08:00"
            }
          ],
          "file": "/etc/systemd/system/tyc-establishment-edinet.timer",
          "line": null,
          "timer_state": "TimersCalendar={ OnCalendar=*-*-* 04:30:00 UTC ; next_elapse=Wed 2026-11-04 04:30:00 UTC }\nNextElapseUSecRealtime=Wed 2026-11-04 04:30:00 UTC\nLastTriggerUSec=Tue 2026-11-03 04:30:01 UTC\nId=tyc-establishment-edinet.timer\nActiveState=active\nUnitFileState=enabled\n",
          "persistent": true,
          "randomized_delay_sec": 0,
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "companies": "派生／聚合结果",
        "crawl_jobs": "爬虫执行记录"
      },
      "description": {
        "summary": "从有价证券报告书的沿革文本块识别公司设立日期，按语义锚点提取并补全企业成立时间。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill `companies.establishment_date` from EDINET 有価証券報告書 XBRL.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 122,
            "symbol": "_parse_date_match",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 144,
            "symbol": "extract_establishment",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 315,
            "symbol": "select_max_fetched_at",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 341,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 137,
            "symbol": "_date_before",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 212,
            "symbol": "find_history_textblock",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 243,
            "symbol": "read_watermark",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 255,
            "symbol": "write_watermark",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 261,
            "symbol": "select_latest_yuho_per_corp",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_establishment_from_edinet.py",
            "line": 478,
            "symbol": "print_samples",
            "origin": "online"
          }
        ],
        "code_sha256": "54191bde2a22ab418a4c884e806e2b6ea705fe52cd20574f1edb6d85240b5523",
        "sources": [
          "edinet"
        ],
        "business_outputs": [
          "companies"
        ],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "16d99cc7a00b",
      "processor": "backend/scripts/parse_change_cause.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "company_relationships"
      ],
      "outputs": [
        "company_relationships"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 411,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_relationships": [
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 426,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_relationships": [
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 436,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        6,
        7
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/parse_change_cause.py",
      "schedule_plans": [
        {
          "task": "parse_change_cause",
          "scheduler": "schedule.yaml",
          "cron": "0 20 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 20:00",
          "command": "python3 -m backend.scripts.parse_change_cause --commit",
          "modules": [
            "backend.scripts.parse_change_cause"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T20:00:00+09:00",
              "beijing": "2026-11-03T19:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-04T20:00:00+09:00",
              "beijing": "2026-11-04T19:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T20:00:00+09:00",
              "beijing": "2026-11-05T19:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 428,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "company_relationships": "派生／聚合结果"
      },
      "description": {
        "summary": "解析国税厅变更原因文本中的日期、对方法人编号和合并或分割动词，生成有方向的企业关系并保留原文。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Parse companies.change_cause (NTA 法人番号 Web-API 自由文) into\nstructured rows in company_relationships.",
        "evidence": [
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 232,
            "symbol": "parse_iso_date",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 244,
            "symbol": "extract_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 295,
            "symbol": "_parse_entry",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 334,
            "symbol": "parse_one_row",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 409,
            "symbol": "fetch_rows",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 421,
            "symbol": "already_inserted_keys",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 447,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/parse_change_cause.py",
            "line": 98,
            "symbol": "_to_int",
            "origin": "online"
          }
        ],
        "code_sha256": "e8878f9093bfbc733287a9df9887cd49a04052c42471134f527c3d24aeaac9a5",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "bd57a54cb85a",
      "processor": "backend/scripts/import_registry_supplier_return.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "legal_registry_requests"
      ],
      "outputs": [
        "legal_registry_requests"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 228,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 240,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "legal_registry_requests": [
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 239,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "legal_registry_requests": [
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 259,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/import_registry_supplier_return.py",
      "schedule_plans": [],
      "output_roles": {
        "legal_registry_requests": "派生／聚合结果"
      },
      "description": {
        "summary": "导入登记供应商返回文件并匹配企业，更新 legal_registry_requests 的处理结果；具体登记内容是否落到其他业务表仍需独立证据。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Bulk-import supplier returned registry/company representative data.",
        "evidence": [
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 67,
            "symbol": "parse_bool",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 76,
            "symbol": "parse_json_maybe",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 90,
            "symbol": "parse_officers",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 129,
            "symbol": "parse_int",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 301,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 35,
            "symbol": "split_names",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 141,
            "symbol": "read_records",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 172,
            "symbol": "normalize_record",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 224,
            "symbol": "find_company",
            "origin": "online"
          },
          {
            "file": "backend/scripts/import_registry_supplier_return.py",
            "line": 235,
            "symbol": "find_open_request",
            "origin": "online"
          }
        ],
        "code_sha256": "40345081c0eee8d88d4e4592c66b5bde883c68466a44cb2330f36a980ffc76a3",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "65c30656f6a0",
      "processor": "backend/scripts/build_business_model_v3.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "awards",
        "care_facilities",
        "companies",
        "company_industry_inferred",
        "company_website_data",
        "construction_licenses",
        "food_business_licenses",
        "government_contracts",
        "hotel_ryokan_registry",
        "intellectual_properties",
        "medical_facilities",
        "school_institution"
      ],
      "outputs": [
        "company_business_model"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 250,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "government_contracts": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 255,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "intellectual_properties": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 256,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "construction_licenses": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 257,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "awards": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 258,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "medical_facilities": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 259,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "care_facilities": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 260,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "hotel_ryokan_registry": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 261,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "school_institution": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 262,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "food_business_licenses": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 263,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_industry_inferred": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 264,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_website_data": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 266,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_business_model": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 404,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        2
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/build_business_model_v3.py",
      "schedule_plans": [],
      "output_roles": {
        "company_business_model": "派生／聚合结果"
      },
      "description": {
        "summary": "在业务模式分类中加入推断行业、官网业务文本和扩充关键词信号，保存分类、得分与来源信号。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Build company_business_model v3 — adds JSIC + website + expanded keyword signals.",
        "evidence": [
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 275,
            "symbol": "classify_one",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 418,
            "symbol": "run_shard",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 511,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/build_business_model_v3.py",
            "line": 492,
            "symbol": "smoke_test",
            "origin": "online"
          }
        ],
        "code_sha256": "71c45e1bd7c92763fb3128384287c5c77ac3238a444cf0954fe126f27aed025e",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "b53b18026c8e",
      "processor": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "legal_registry_requests",
        "officers"
      ],
      "outputs": [
        "legal_registry_requests"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 128,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "legal_registry_requests": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 154,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 140,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "legal_registry_requests": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 196,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
      "schedule_plans": [],
      "output_roles": {
        "legal_registry_requests": "派生／聚合结果"
      },
      "description": {
        "summary": "从指定批次及企业、任职资料整理商业登记查询对象，写入 legal_registry_requests 请求队列，保留批次上下文。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Enqueue a prepared supplier batch into legal_registry_requests.",
        "evidence": [
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 255,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 30,
            "symbol": "read_batch",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 35,
            "symbol": "split_tags",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 41,
            "symbol": "company_corporation_no",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 51,
            "symbol": "retrieval_options",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 91,
            "symbol": "meta_for_row",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 124,
            "symbol": "find_company",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 135,
            "symbol": "has_current_officer",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 150,
            "symbol": "find_existing_request",
            "origin": "online"
          },
          {
            "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
            "line": 165,
            "symbol": "enqueue_row",
            "origin": "online"
          }
        ],
        "code_sha256": "b9c61122e81b82c5cb7eec8a201673d03f563fcea6f803dc8aea9adc3ecafb71",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "81a6b2b1e865",
      "processor": "backend/scripts/recompute_share_count_by_cluster.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies"
      ],
      "outputs": [
        "address_clusters",
        "companies",
        "company_paper_co_flag"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 31,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 50,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 53,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 38,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 39,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 45,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "company_paper_co_flag": [
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 51,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "address_clusters": [
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 57,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 58,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 62,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        3,
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/recompute_share_count_by_cluster.py",
      "schedule_plans": [],
      "output_roles": {
        "address_clusters": "派生／聚合结果",
        "companies": "派生／聚合结果",
        "company_paper_co_flag": "派生／聚合结果"
      },
      "description": {
        "summary": "按地址簇重算企业同址数量，并同步相关纸面公司线索数据。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "按 address_cluster_id 重算 companies.address_share_count + paper_co_flag.address_share_count.",
        "evidence": [
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/recompute_share_count_by_cluster.py",
            "line": 70,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "42207c634aa0340a6bbf611f44d4aaab54610c0e544f8d69119d032e0d1ee75b",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "091bb19f7b1e",
      "processor": "backend/scripts/derive_company_location_profiles.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "company_geo_density_grid",
        "company_geocodes",
        "company_location_profiles",
        "land_prices",
        "real_estate_transactions"
      ],
      "outputs": [
        "company_geo_density_grid",
        "company_location_profiles",
        "crawl_jobs"
      ],
      "input_evidence": {
        "land_prices": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 196,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 221,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_geo_density_grid": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 242,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 135,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "real_estate_transactions": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 275,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 160,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 119,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_geocodes": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 161,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_location_profiles": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 162,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_geo_density_grid": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 107,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "company_geo_density_grid",
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 107,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\n                    INSERT INTO company_geo_density_grid (\n                        scale_m, lat_bin, lng_bin,\n                        company_count, risk_count, listed_count, computed_at\n                    )\n                    SELECT\n                        %s AS scale_m,\n                        floor(c.geo_lat::float8 / %s)::int AS lat_bin,\n                        floor(c.geo_lng::float8 / %s)::int AS lng_bin,\n                        count(*)::int AS company_count,\n                        count(*) FILTER (WHERE c.has_risk_events)::int AS risk_count,\n                        count(*) FILTER (WHERE c.is_listed)::int AS listed_count,\n                        now()\n                      FROM companies c\n                     WHERE c.geo_lat IS NOT NULL\n                       AND c.geo_lng IS NOT NULL\n                     GROUP BY 1, 2, 3\n                    "
          }
        ],
        "company_location_profiles": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 349,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "company_location_profiles",
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 349,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\n                    INSERT INTO company_location_profiles (\n                        corporate_number, geo_lat, geo_lng, geocode_confidence,\n                        nearest_land_price_id, nearest_land_price_year,\n                        nearest_land_price_jpy_per_sqm, nearest_land_price_yoy_pct,\n                        nearest_land_price_distance_m, nearest_land_price_use_category,\n                        nearest_land_price_station,\n                        land_price_points_1km, land_price_avg_1km, land_price_max_1km,\n                        land_price_yoy_avg_1km,\n                        tx_city_code, tx_count_3y, tx_median_price_jpy,\n                        tx_avg_price_per_sqm, tx_latest_year,\n                        nearby_companies_200m, nearby_companies_1km, nearby_companies_3km,\n                        nearby_risk_companies_1km, nearby_listed_companies_1km,\n                        same_address_count, location_signal_score, signals,\n                        computed_at, source_ver"
          }
        ],
        "crawl_jobs": [
          {
            "table": "crawl_jobs",
            "file": "backend/crawlers/storage.py",
            "line": 152,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n            INSERT INTO crawl_jobs (source_id, job_type, started_at, status)\n            VALUES (%s, %s, now(), 'running')\n            RETURNING id, started_at\n        "
          },
          {
            "table": "crawl_jobs",
            "file": "backend/crawlers/storage.py",
            "line": 169,
            "origin": "online",
            "kind": "called_helper_sql",
            "sql": "\n            UPDATE crawl_jobs\n               SET finished_at=now(), status=%s,\n                   records_fetched=%s, records_new=%s, records_updated=%s,\n                   bytes_downloaded=%s, error_message=%s, metrics=%s::jsonb\n             WHERE id=%s AND started_at=%s\n        "
          }
        ]
      },
      "dimensions": [
        3
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/derive_company_location_profiles.py",
      "schedule_plans": [
        {
          "task": "company_location_profile",
          "scheduler": "schedule.yaml",
          "cron": "55 * * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "high_frequency",
          "label": "每小时第 55 分",
          "command": "python3 -m backend.scripts.derive_company_location_profiles --batch-size 1000 --max-batches 500 --workers 4 --job-type scheduled",
          "modules": [
            "backend.scripts.derive_company_location_profiles"
          ],
          "selected_sources": [],
          "timeout_min_configured": 45,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-03T17:55:00+09:00",
              "beijing": "2026-11-03T16:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T18:55:00+09:00",
              "beijing": "2026-11-03T17:55:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-03T19:55:00+09:00",
              "beijing": "2026-11-03T18:55:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 305,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "company_geo_density_grid": "派生／聚合结果",
        "company_location_profiles": "派生／聚合结果",
        "crawl_jobs": "爬虫执行记录"
      },
      "description": {
        "summary": "将企业地理坐标与不动产空间数据关联，生成所在地环境画像及相关空间汇总。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Derive company location profiles from geocodes + reinfolib data.",
        "evidence": [
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 179,
            "symbol": "fetch_nearest_land",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 207,
            "symbol": "fetch_land_stats",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 237,
            "symbol": "fetch_company_density",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 266,
            "symbol": "fetch_tx_stats",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 333,
            "symbol": "upsert_profile",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 450,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 489,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 54,
            "symbol": "conn",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 62,
            "symbol": "ensure_schema",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_company_location_profiles.py",
            "line": 74,
            "symbol": "reinfolib_city_code",
            "origin": "online"
          }
        ],
        "code_sha256": "b6ca71375479e1c3c491e1042329d0d5d6ce36851795a59c0ce34601c4814118",
        "sources": [
          "company_location_profile"
        ],
        "business_outputs": [
          "company_geo_density_grid",
          "company_location_profiles"
        ],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "eecd6e591922",
      "processor": "backend/scripts/backfill_partnership_declaration_reps.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "certifications",
        "companies",
        "data_sources",
        "officers",
        "partnership_declaration_pdf_done",
        "persons"
      ],
      "outputs": [
        "certifications",
        "officers",
        "partnership_declaration_pdf_done",
        "persons"
      ],
      "input_evidence": {
        "partnership_declaration_pdf_done": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 954,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1067,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1253,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 228,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 763,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "certifications": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 955,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1068,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1255,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 226,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 956,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1069,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1256,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 227,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1078,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1251,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 215,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 688,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 764,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 863,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 873,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 798,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 807,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "persons": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1252,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 584,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 767,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 803,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 202,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "persons": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 597,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 857,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1429,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 616,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1399,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1433,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 876,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "partnership_declaration_pdf_done": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 703,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 846,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1438,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 826,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 976,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 989,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "certifications": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 666,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1457,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 815,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1031,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_partnership_declaration_reps.py",
      "schedule_plans": [
        {
          "task": "partnership_declaration_reps",
          "scheduler": "schedule.yaml",
          "cron": "30 5 5 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 5 日 05:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --limit 20000 --batch-size 200 --concurrency 4",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-05T05:30:00+09:00",
              "beijing": "2026-11-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-05T05:30:00+09:00",
              "beijing": "2026-12-05T04:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-05T05:30:00+09:00",
              "beijing": "2027-01-05T04:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 722,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "scheduler": "schedule.yaml",
          "cron": "30 6 6 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 6 日 06:30",
          "command": "python3 -m backend.scripts.backfill_partnership_declaration_reps --ocr-no-representative --ocr-consensus --limit 300 --batch-size 50 --concurrency 2 --timeout 60",
          "modules": [
            "backend.scripts.backfill_partnership_declaration_reps"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "incremental",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-06T06:30:00+09:00",
              "beijing": "2026-11-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2026-12-06T06:30:00+09:00",
              "beijing": "2026-12-06T05:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-06T06:30:00+09:00",
              "beijing": "2027-01-06T05:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 728,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "certifications": "派生／聚合结果",
        "officers": "派生／聚合结果",
        "partnership_declaration_pdf_done": "处理完成标记／检查点",
        "persons": "派生／聚合结果"
      },
      "description": {
        "summary": "下载伙伴关系宣言 PDF，提取代表人式签署人并保存证据；签署人线索与商事登记代表人区分。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill representative-like signatories from Partnership Declaration PDFs.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 207,
            "symbol": "fetch_candidates",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 324,
            "symbol": "parse_pdf_result",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 347,
            "symbol": "parse_ocr_text_result",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 371,
            "symbol": "parse_ocr_variants_arg",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 504,
            "symbol": "parse_ocr_consensus_result",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 567,
            "symbol": "fetch_all",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 581,
            "symbol": "upsert_person",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 611,
            "symbol": "insert_officer",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 886,
            "symbol": "fetch_current_api_index",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_partnership_declaration_reps.py",
            "line": 1057,
            "symbol": "fetch_ocr_candidates",
            "origin": "online"
          }
        ],
        "code_sha256": "ce367edd330e88c83ca0cfd1a3c576f9852cb5c53e803cfae1c1ab128f3a66b0",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "a38985fe0709",
      "processor": "backend/scripts/backfill_new_source_company_matches.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "certifications",
        "companies",
        "company_aliases",
        "data_sources",
        "ipa_security_action_declarations",
        "jetro_case_studies",
        "jftc_subcontract_recommendations",
        "risk_events",
        "smart_sme_supporters"
      ],
      "outputs": [
        "certifications",
        "government_procurement_suspensions",
        "jetro_case_studies",
        "jftc_subcontract_recommendations",
        "risk_events"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 472,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 546,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 566,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 534,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_aliases": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 580,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "jetro_case_studies": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 122,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "certifications": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 154,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 197,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 238,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 155,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 198,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 239,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 278,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 363,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "smart_sme_supporters": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 199,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "ipa_security_action_declarations": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 240,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "risk_events": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 277,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 362,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "jftc_subcontract_recommendations": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 323,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "certifications": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 748,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 619,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "jetro_case_studies": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 598,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "jftc_subcontract_recommendations": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 631,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "risk_events": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 644,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 666,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "government_procurement_suspensions": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 690,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        2,
        10
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_new_source_company_matches.py",
      "schedule_plans": [],
      "output_roles": {
        "certifications": "派生／聚合结果",
        "government_procurement_suspensions": "派生／聚合结果",
        "jetro_case_studies": "派生／聚合结果",
        "jftc_subcontract_recommendations": "派生／聚合结果",
        "risk_events": "派生／聚合结果"
      },
      "description": {
        "summary": "将已采集的新来源记录与 companies、company_aliases 做保守企业匹配，回填匹配结果或风险／认证关联。各来源有独立分支，不能把所有输入来源与所有输出表交叉连接；默认试运行，需 --apply 才写入。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Conservatively attach newly crawled public-source rows to companies.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 83,
            "symbol": "extract_prefecture",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 592,
            "symbol": "apply_match",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 709,
            "symbol": "match_evidence_json",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 724,
            "symbol": "apply_certification_matches_bulk",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 759,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 67,
            "symbol": "norm_text",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 71,
            "symbol": "as_dict",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 92,
            "symbol": "clean_jetro_company_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 104,
            "symbol": "cert_name_from_meta",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_new_source_company_matches.py",
            "line": 116,
            "symbol": "iter_jetro",
            "origin": "online"
          }
        ],
        "code_sha256": "0258e8c0ff76d3376d32048f66756e8807ba5f0b4294b0b0427584c7b4c99f53",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "9845836c83db",
      "processor": "backend/scripts/fetch_legal_registry_toukikun.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "data_sources",
        "legal_registry_requests",
        "officers",
        "persons"
      ],
      "outputs": [
        "company_registered_profiles",
        "data_sources",
        "legal_registry_requests",
        "officers",
        "persons"
      ],
      "input_evidence": {
        "data_sources": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 129,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "legal_registry_requests": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 168,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 169,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "persons": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 181,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 182,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "data_sources": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 135,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "persons": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 194,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 237,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "company_registered_profiles": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 287,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "legal_registry_requests": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 337,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 370,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 386,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        5
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/fetch_legal_registry_toukikun.py",
      "schedule_plans": [],
      "output_roles": {
        "company_registered_profiles": "派生／聚合结果",
        "data_sources": "来源登记元数据",
        "legal_registry_requests": "派生／聚合结果",
        "officers": "派生／聚合结果",
        "persons": "派生／聚合结果"
      },
      "description": {
        "summary": "读取待查询的商业登记请求队列，在显式 --apply 且具有供应商凭据时取得登记信息，写入 company_registered_profiles 等表并回填请求状态。默认不发起正式查询；有实现不代表已经运行或有数据。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Fetch commercial-registry profiles through the authorized 登記くん API.",
        "evidence": [
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 32,
            "symbol": "parse_timestamp",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 151,
            "symbol": "fetch_queue",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 210,
            "symbol": "upsert_representative_officers",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 382,
            "symbol": "mark_running",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 398,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 41,
            "symbol": "unique_names",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 57,
            "symbol": "validate_payload_corporate_number",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 74,
            "symbol": "registered_officers",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 128,
            "symbol": "ensure_source",
            "origin": "online"
          },
          {
            "file": "backend/scripts/fetch_legal_registry_toukikun.py",
            "line": 177,
            "symbol": "find_or_create_person",
            "origin": "online"
          }
        ],
        "code_sha256": "4a8293ec20630242a3ff4066c5cb4777f07e5a835fd484e3a76423193a06f5da",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "25dc28127478",
      "processor": "backend/scripts/derive_foreign_capital.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "shareholders"
      ],
      "outputs": [
        "company_foreign_capital"
      ],
      "input_evidence": {
        "shareholders": [
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 327,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 333,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "company_foreign_capital": [
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 304,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "table": "company_foreign_capital",
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 304,
            "origin": "online",
            "kind": "sql_write",
            "sql": "\nINSERT INTO company_foreign_capital (\n    corporate_number, foreign_capital_country, foreign_capital_pct,\n    top_foreign_shareholder, top_foreign_shareholder_country,\n    top_foreign_shareholder_ratio, n_foreign_holders,\n    derived_from, latest_filing_as_of, meta\n) VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s)\nON CONFLICT (corporate_number) DO UPDATE SET\n    foreign_capital_country         = EXCLUDED.foreign_capital_country,\n    foreign_capital_pct             = EXCLUDED.foreign_capital_pct,\n    top_foreign_shareholder         = EXCLUDED.top_foreign_shareholder,\n    top_foreign_shareholder_country = EXCLUDED.top_foreign_shareholder_country,\n    top_foreign_shareholder_ratio   = EXCLUDED.top_foreign_shareholder_ratio,\n    n_foreign_holders               = EXCLUDED.n_foreign_holders,\n    derived_from                    = EXCLUDED.derived_from,\n    latest_filing_as_of             = EXCLUDED.latest_filing_as_of,\n    derived_at                      = now(),\n    meta                    "
          }
        ]
      },
      "dimensions": [
        6
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/derive_foreign_capital.py",
      "schedule_plans": [
        {
          "task": "edinet_foreign_capital_derived",
          "scheduler": "schedule.yaml",
          "cron": "30 11 1 * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "monthly",
          "label": "每月 1 日 11:30",
          "command": "python3 -m backend.scripts.derive_foreign_capital",
          "modules": [
            "backend.scripts.derive_foreign_capital"
          ],
          "selected_sources": [],
          "timeout_min_configured": 30,
          "max_instances_configured": 1,
          "strategy": "replace",
          "next_fires": [
            {
              "scheduled_timezone": "2026-12-01T11:30:00+09:00",
              "beijing": "2026-12-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-01-01T11:30:00+09:00",
              "beijing": "2027-01-01T10:30:00+08:00"
            },
            {
              "scheduled_timezone": "2027-02-01T11:30:00+09:00",
              "beijing": "2027-02-01T10:30:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 337,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "company_foreign_capital": "派生／聚合结果"
      },
      "description": {
        "summary": "解析已存股东名称中的国家或境外法人形式线索，聚合外资持股信号；不能等同于完整最终受益所有人识别。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Derive `company_foreign_capital` from existing `shareholders` table.",
        "evidence": [
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 178,
            "symbol": "extract_english",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 192,
            "symbol": "classify_holder",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 342,
            "symbol": "run_tests",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 409,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_foreign_capital.py",
            "line": 243,
            "symbol": "aggregate_company",
            "origin": "online"
          }
        ],
        "code_sha256": "ce5b61b01b4fa2f541b47500866fd92057699323ed8b1f2d78872501fdc8ae5a",
        "sources": [
          "edinet_foreign_capital_derived"
        ],
        "business_outputs": [
          "company_foreign_capital"
        ],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "0064bb1e0857",
      "processor": "backend/scripts/backfill_officers_from_public_reps.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "business_licenses",
        "certifications",
        "officers",
        "persons",
        "university_startups"
      ],
      "outputs": [
        "officers",
        "persons"
      ],
      "input_evidence": {
        "certifications": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 78,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 82,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 89,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 115,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 142,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 171,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 377,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "university_startups": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 111,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "business_licenses": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 137,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 166,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "persons": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 284,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "persons": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 297,
            "origin": "online",
            "kind": "sql_write"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 323,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/backfill_officers_from_public_reps.py",
      "schedule_plans": [],
      "output_roles": {
        "officers": "派生／聚合结果",
        "persons": "派生／聚合结果"
      },
      "description": {
        "summary": "复用认证、大学创业企业及旅行许可中较可靠的代表人字段，清洗姓名并补全人员和任职关系。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Backfill conservative representative officers from structured public fields.",
        "evidence": [
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 196,
            "symbol": "parse_name",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 233,
            "symbol": "fetch_candidates",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 281,
            "symbol": "upsert_person",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 320,
            "symbol": "insert_officer",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 356,
            "symbol": "run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 394,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/backfill_officers_from_public_reps.py",
            "line": 224,
            "symbol": "role_tier",
            "origin": "online"
          }
        ],
        "code_sha256": "c93aa47d520e9abf683d2b938a2015fec56b2af10d46efce0a3a85c571a2beec",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "4cf994e7199f",
      "processor": "backend/scripts/derive_data_quality.py",
      "processor_kind": "python",
      "status": "confirmed_code",
      "inputs": [
        "care_facilities",
        "companies",
        "company_industry_inferred",
        "company_website_data",
        "construction_licenses",
        "disability_welfare_facilities",
        "financial_statements",
        "hotel_ryokan_registry",
        "npo_facilities",
        "officers",
        "pharmacy_registry",
        "university_startups"
      ],
      "outputs": [
        "companies"
      ],
      "input_evidence": {
        "financial_statements": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 114,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 156,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 161,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_website_data": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 117,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 132,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 137,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 158,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "construction_licenses": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 119,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 134,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 143,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "university_startups": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 121,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "company_industry_inferred": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 125,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 129,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "hotel_ryokan_registry": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 139,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "care_facilities": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 141,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "disability_welfare_facilities": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 145,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "pharmacy_registry": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 147,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "npo_facilities": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 149,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 165,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 183,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 404,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 413,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 381,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 382,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 382,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "companies": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 215,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "模块内静态读取／写入集合；可有不同模式、函数或分支，不表示每次必读全部输入，也不表示任意输入都会逐行生成每个输出。",
      "schedule_lookup": "backend/scripts/derive_data_quality.py",
      "schedule_plans": [
        {
          "task": "data_quality_derived",
          "scheduler": "schedule.yaml",
          "cron": "0 3 * * *",
          "timezone": "Asia/Tokyo",
          "enabled": true,
          "frequency": "daily",
          "label": "每天 03:00",
          "command": "python3 -m backend.scripts.derive_data_quality --workers 3",
          "modules": [
            "backend.scripts.derive_data_quality"
          ],
          "selected_sources": [],
          "timeout_min_configured": 240,
          "max_instances_configured": 1,
          "strategy": "full",
          "next_fires": [
            {
              "scheduled_timezone": "2026-11-04T03:00:00+09:00",
              "beijing": "2026-11-04T02:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-05T03:00:00+09:00",
              "beijing": "2026-11-05T02:00:00+08:00"
            },
            {
              "scheduled_timezone": "2026-11-06T03:00:00+09:00",
              "beijing": "2026-11-06T02:00:00+08:00"
            }
          ],
          "file": "backend/crawlers/schedule.yaml",
          "line": 287,
          "weekday_convention": "APScheduler 3: Monday=0",
          "association": "direct",
          "association_note": "加工程序的直接调度入口"
        }
      ],
      "output_roles": {
        "companies": "派生／聚合结果"
      },
      "description": {
        "summary": "根据企业必填属性、补充属性和来源覆盖计算数据完整度分数，回写企业数据质量指标。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Derive `companies.data_quality` (smallint 0-100) from completeness signals.",
        "evidence": [
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 288,
            "symbol": "dry_run_prefecture",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 323,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 85,
            "symbol": "connect_database",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 251,
            "symbol": "process_prefecture",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 369,
            "symbol": "sample_select",
            "origin": "online"
          },
          {
            "file": "backend/scripts/derive_data_quality.py",
            "line": 397,
            "symbol": "final_stats",
            "origin": "online"
          }
        ],
        "code_sha256": "8b4eecf43682f18b6313e828e4d020c96080b4d5aa6b247ac55f2eb8a8dd3136",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "687a47dc62b3",
      "processor": "database:public.mv_company_risk_summary",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "risk_events"
      ],
      "outputs": [
        "mv_company_risk_summary"
      ],
      "input_evidence": {
        "risk_events": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.mv_company_risk_summary"
          }
        ]
      },
      "output_evidence": {
        "mv_company_risk_summary": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.mv_company_risk_summary"
          }
        ]
      },
      "dimensions": [
        10
      ],
      "scope_note": "数据库中当前定义与依赖已确认；物化视图需要刷新，不表示输入变化会自动实时更新。刷新任务及频率待核实。",
      "definition": " SELECT corporate_number,\n    count(*) FILTER (WHERE category::text = 'admin_action'::text AND event_date > (now() - '3 years'::interval)) AS admin_3y,\n    count(*) FILTER (WHERE category::text = 'bankruptcy'::text) AS bankruptcy_total,\n    count(*) FILTER (WHERE category::text = 'litigation'::text) AS litigation_total,\n    count(*) FILTER (WHERE category::text = 'sanction'::text) AS sanction_total,\n    count(*) FILTER (WHERE category::text = 'tax_default'::text) AS tax_default_total,\n    count(*) FILTER (WHERE category::text = 'labor_violation'::text) AS labor_violation_total,\n    max(severity) FILTER (WHERE event_date > (now() - '1 year'::interval)) AS max_recent_severity,\n    max(event_date) AS last_event_at\n   FROM risk_events\n  WHERE corporate_number IS NOT NULL\n  GROUP BY corporate_number;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "mv_company_risk_summary": "派生／聚合结果"
      },
      "description": {
        "summary": "按企业聚合已有风险事件，形成风险摘要物化视图。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      }
    },
    {
      "id": "aedcd374c449",
      "processor": "database:public.seo_company_name_bucket_rank",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "seo_company_name_index"
      ],
      "outputs": [
        "seo_company_name_bucket_rank"
      ],
      "input_evidence": {
        "seo_company_name_index": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_company_name_bucket_rank"
          }
        ]
      },
      "output_evidence": {
        "seo_company_name_bucket_rank": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_company_name_bucket_rank"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " WITH bucketed AS (\n         SELECT 'a'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ァ'::text AND c.name_kana::text < 'カ'::text\n        UNION ALL\n         SELECT 'ka'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'カ'::text AND c.name_kana::text < 'サ'::text\n        UNION ALL\n         SELECT 'sa'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'サ'::text AND c.name_kana::text < 'タ'::text\n        UNION ALL\n         SELECT 'ta'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'タ'::text AND c.name_kana::text < 'ナ'::text\n        UNION ALL\n         SELECT 'na'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ナ'::text AND c.name_kana::text < 'ハ'::text\n        UNION ALL\n         SELECT 'ha'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ハ'::text AND c.name_kana::text < 'マ'::text\n        UNION ALL\n         SELECT 'ma'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'マ'::text AND c.name_kana::text < 'ヤ'::text\n        UNION ALL\n         SELECT 'ya'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ヤ'::text AND c.name_kana::text < 'ラ'::text\n        UNION ALL\n         SELECT 'ra'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ラ'::text AND c.name_kana::text < 'ワ'::text\n        UNION ALL\n         SELECT 'wa'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name_kana::text >= 'ワ'::text AND c.name_kana::text < 'ヷ'::text\n        UNION ALL\n         SELECT 'latin'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name::text ~ '^[A-Za-z]'::text OR c.name::text ~ '^[Ａ-Ｚａ-ｚ]'::text\n        UNION ALL\n         SELECT 'number'::text AS bucket,\n            c.corporate_number,\n            c.name,\n            c.name_kana,\n            c.prefecture,\n            c.city,\n            c.status,\n            c.is_listed,\n            c.ticker,\n            c.risk_score,\n            c.popularity_score,\n            c.has_risk_events,\n            c.invoice_status,\n            c.weight\n           FROM seo_company_name_index c\n          WHERE c.name::text ~ '^[0-9]'::text OR c.name::text ~ '^[０-９]'::text\n        )\n SELECT bucket,\n    row_number() OVER (PARTITION BY bucket ORDER BY weight DESC, is_listed DESC, risk_score DESC NULLS LAST, popularity_score DESC NULLS LAST, (COALESCE(name_kana, name)), corporate_number)::integer AS bucket_rank,\n    corporate_number\n   FROM bucketed;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_company_name_bucket_rank": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "对名称索引按分桶计算排序，供名称检索和列表页面使用。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      }
    },
    {
      "id": "0aa414564170",
      "processor": "database:public.seo_company_name_index",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "companies"
      ],
      "outputs": [
        "seo_company_name_index"
      ],
      "input_evidence": {
        "companies": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_company_name_index"
          }
        ]
      },
      "output_evidence": {
        "seo_company_name_index": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_company_name_index"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " SELECT corporate_number,\n    name,\n    name_kana,\n    prefecture,\n    city,\n    status,\n    is_listed,\n    ticker,\n    risk_score,\n    popularity_score,\n    has_risk_events,\n    invoice_status,\n        CASE\n            WHEN is_listed THEN 100\n            WHEN COALESCE(has_risk_events, false) OR risk_score >= 60 THEN 88\n            WHEN invoice_status::text = 'active'::text THEN 72\n            WHEN COALESCE(popularity_score, 0) > 0 THEN 68\n            ELSE 60\n        END AS weight\n   FROM companies c\n  WHERE status::text = 'active'::text AND name IS NOT NULL AND corporate_number IS NOT NULL;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_company_name_index": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "根据已存企业或人员关联资料构建名称检索索引。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      }
    },
    {
      "id": "8bf0490e286e",
      "processor": "database:public.seo_company_sitemap_prefixes",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "companies"
      ],
      "outputs": [
        "seo_company_sitemap_prefixes"
      ],
      "input_evidence": {
        "companies": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_company_sitemap_prefixes"
          }
        ]
      },
      "output_evidence": {
        "seo_company_sitemap_prefixes": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_company_sitemap_prefixes"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " SELECT SUBSTRING(corporate_number FROM 1 FOR 5) AS id,\n    count(*) AS count\n   FROM companies\n  WHERE status::text = 'active'::text AND corporate_number IS NOT NULL\n  GROUP BY (SUBSTRING(corporate_number FROM 1 FOR 5));",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_company_sitemap_prefixes": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "按前缀分组生成站点地图分片索引，供相关页面被搜索引擎发现。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      }
    },
    {
      "id": "b940e1119085",
      "processor": "database:public.seo_invoice_sitemap_prefixes",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "invoice_registrants"
      ],
      "outputs": [
        "seo_invoice_sitemap_prefixes"
      ],
      "input_evidence": {
        "invoice_registrants": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_invoice_sitemap_prefixes"
          }
        ]
      },
      "output_evidence": {
        "seo_invoice_sitemap_prefixes": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_invoice_sitemap_prefixes"
          }
        ]
      },
      "dimensions": [
        1,
        10
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " SELECT SUBSTRING(registration_number FROM 2 FOR 5) AS id,\n    count(*) AS count\n   FROM invoice_registrants\n  WHERE invalid_date IS NULL AND registration_number IS NOT NULL\n  GROUP BY (SUBSTRING(registration_number FROM 2 FOR 5));",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_invoice_sitemap_prefixes": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "按前缀分组生成站点地图分片索引，供相关页面被搜索引擎发现。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      }
    },
    {
      "id": "09798c476b6a",
      "processor": "database:public.seo_person_name_bucket_rank",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "seo_person_name_index"
      ],
      "outputs": [
        "seo_person_name_bucket_rank"
      ],
      "input_evidence": {
        "seo_person_name_index": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_bucket_rank"
          }
        ]
      },
      "output_evidence": {
        "seo_person_name_bucket_rank": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_person_name_bucket_rank"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " WITH bucketed AS (\n         SELECT 'a'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ァ'::text AND p.name_kana::text < 'カ'::text\n        UNION ALL\n         SELECT 'ka'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'カ'::text AND p.name_kana::text < 'サ'::text\n        UNION ALL\n         SELECT 'sa'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'サ'::text AND p.name_kana::text < 'タ'::text\n        UNION ALL\n         SELECT 'ta'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'タ'::text AND p.name_kana::text < 'ナ'::text\n        UNION ALL\n         SELECT 'na'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ナ'::text AND p.name_kana::text < 'ハ'::text\n        UNION ALL\n         SELECT 'ha'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ハ'::text AND p.name_kana::text < 'マ'::text\n        UNION ALL\n         SELECT 'ma'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'マ'::text AND p.name_kana::text < 'ヤ'::text\n        UNION ALL\n         SELECT 'ya'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ヤ'::text AND p.name_kana::text < 'ラ'::text\n        UNION ALL\n         SELECT 'ra'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ラ'::text AND p.name_kana::text < 'ワ'::text\n        UNION ALL\n         SELECT 'wa'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE p.name_kana::text >= 'ワ'::text AND p.name_kana::text < 'ヷ'::text\n        UNION ALL\n         SELECT 'latin'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE COALESCE(p.display_name::text ~ '^[A-Za-z]'::text, false) OR COALESCE(p.display_name::text ~ '^[Ａ-Ｚａ-ｚ]'::text, false) OR COALESCE(p.name_en::text ~ '^[A-Za-z]'::text, false)\n        UNION ALL\n         SELECT 'other'::text AS bucket,\n            p.id,\n            p.display_name,\n            p.name_kana,\n            p.name_en,\n            p.created_at,\n            p.last_modified,\n            p.n_companies,\n            p.n_listed_companies,\n            p.n_current_positions,\n            p.n_past_positions,\n            p.prestige_score,\n            p.current_companies,\n            p.has_officer,\n            p.is_politician,\n            p.is_professional,\n            p.has_public_recognition,\n            p.has_revolving_door,\n            p.politician_count,\n            p.professional_count,\n            p.public_recognition_count,\n            p.revolving_door_count\n           FROM seo_person_name_index p\n          WHERE (p.name_kana IS NULL OR p.name_kana::text = ''::text OR p.name_kana::text < 'ァ'::text OR p.name_kana::text >= 'ヷ'::text) AND NOT (COALESCE(p.display_name::text ~ '^[A-Za-z]'::text, false) OR COALESCE(p.display_name::text ~ '^[Ａ-Ｚａ-ｚ]'::text, false) OR COALESCE(p.name_en::text ~ '^[A-Za-z]'::text, false))\n        )\n SELECT bucket,\n    row_number() OVER (PARTITION BY bucket ORDER BY has_revolving_door DESC, is_politician DESC, n_listed_companies DESC, prestige_score DESC, n_current_positions DESC, n_companies DESC, has_officer DESC, is_professional DESC, has_public_recognition DESC, (COALESCE(name_kana, display_name)), id)::integer AS bucket_rank,\n    id\n   FROM bucketed;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_person_name_bucket_rank": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "对名称索引按分桶计算排序，供名称检索和列表页面使用。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      }
    },
    {
      "id": "140f617be817",
      "processor": "database:public.seo_person_name_index",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "companies",
        "gov_revolving_door",
        "local_public_recognitions",
        "officers",
        "person_officer_stats",
        "persons",
        "politicians",
        "professionals"
      ],
      "outputs": [
        "seo_person_name_index"
      ],
      "input_evidence": {
        "companies": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "gov_revolving_door": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "local_public_recognitions": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "officers": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "person_officer_stats": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "persons": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "politicians": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ],
        "professionals": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ]
      },
      "output_evidence": {
        "seo_person_name_index": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_person_name_index"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " WITH signal_persons AS (\n         SELECT officers.person_id\n           FROM officers\n          WHERE officers.person_id IS NOT NULL\n        UNION\n         SELECT person_officer_stats.person_id\n           FROM person_officer_stats\n          WHERE person_officer_stats.person_id IS NOT NULL\n        UNION\n         SELECT politicians.person_id\n           FROM politicians\n          WHERE politicians.person_id IS NOT NULL\n        UNION\n         SELECT professionals.person_id\n           FROM professionals\n          WHERE professionals.person_id IS NOT NULL\n        UNION\n         SELECT local_public_recognitions.person_id\n           FROM local_public_recognitions\n          WHERE local_public_recognitions.person_id IS NOT NULL\n        UNION\n         SELECT gov_revolving_door.person_id\n           FROM gov_revolving_door\n          WHERE gov_revolving_door.person_id IS NOT NULL\n        ), officer_counts AS (\n         SELECT o.person_id,\n            count(DISTINCT o.corporate_number)::integer AS n_companies,\n            count(*) FILTER (WHERE o.is_current)::integer AS n_current_positions,\n            count(*) FILTER (WHERE NOT o.is_current)::integer AS n_past_positions,\n            count(DISTINCT c.corporate_number) FILTER (WHERE COALESCE(c.is_listed, false))::integer AS n_listed_companies\n           FROM officers o\n             LEFT JOIN companies c USING (corporate_number)\n          WHERE o.person_id IS NOT NULL\n          GROUP BY o.person_id\n        ), politician_counts AS (\n         SELECT politicians.person_id,\n            count(*)::integer AS n\n           FROM politicians\n          WHERE politicians.person_id IS NOT NULL\n          GROUP BY politicians.person_id\n        ), professional_counts AS (\n         SELECT professionals.person_id,\n            count(*)::integer AS n\n           FROM professionals\n          WHERE professionals.person_id IS NOT NULL\n          GROUP BY professionals.person_id\n        ), public_recognition_counts AS (\n         SELECT local_public_recognitions.person_id,\n            count(*)::integer AS n\n           FROM local_public_recognitions\n          WHERE local_public_recognitions.person_id IS NOT NULL\n          GROUP BY local_public_recognitions.person_id\n        ), revolving_door_counts AS (\n         SELECT gov_revolving_door.person_id,\n            count(*)::integer AS n\n           FROM gov_revolving_door\n          WHERE gov_revolving_door.person_id IS NOT NULL\n          GROUP BY gov_revolving_door.person_id\n        )\n SELECT p.id,\n    p.display_name,\n    p.name_kana,\n    p.name_en,\n    p.created_at,\n    COALESCE(pos.updated_at::date, p.created_at::date) AS last_modified,\n    GREATEST(COALESCE(pos.n_companies, 0), COALESCE(oc.n_companies, 0)) AS n_companies,\n    GREATEST(COALESCE(pos.n_listed_companies, 0), COALESCE(oc.n_listed_companies, 0)) AS n_listed_companies,\n    GREATEST(COALESCE(pos.n_current_positions, 0), COALESCE(oc.n_current_positions, 0)) AS n_current_positions,\n    GREATEST(COALESCE(pos.n_past_positions, 0), COALESCE(oc.n_past_positions, 0)) AS n_past_positions,\n    COALESCE(pos.prestige_score::integer, 0) AS prestige_score,\n    pos.current_companies,\n    oc.person_id IS NOT NULL OR pos.person_id IS NOT NULL AS has_officer,\n    COALESCE(pc.n, 0) > 0 AS is_politician,\n    COALESCE(profc.n, 0) > 0 AS is_professional,\n    COALESCE(prc.n, 0) > 0 AS has_public_recognition,\n    COALESCE(rdc.n, 0) > 0 AS has_revolving_door,\n    COALESCE(pc.n, 0) AS politician_count,\n    COALESCE(profc.n, 0) AS professional_count,\n    COALESCE(prc.n, 0) AS public_recognition_count,\n    COALESCE(rdc.n, 0) AS revolving_door_count\n   FROM signal_persons sp\n     JOIN persons p ON p.id = sp.person_id\n     LEFT JOIN person_officer_stats pos ON pos.person_id = p.id\n     LEFT JOIN officer_counts oc ON oc.person_id = p.id\n     LEFT JOIN politician_counts pc ON pc.person_id = p.id\n     LEFT JOIN professional_counts profc ON profc.person_id = p.id\n     LEFT JOIN public_recognition_counts prc ON prc.person_id = p.id\n     LEFT JOIN revolving_door_counts rdc ON rdc.person_id = p.id\n  WHERE COALESCE(p.display_policy, 'public'::character varying)::text <> 'hidden'::text AND COALESCE(p.status, 'active'::character varying)::text <> 'invalid'::text AND p.merged_into_id IS NULL AND p.display_name IS NOT NULL;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_person_name_index": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "根据已存企业或人员关联资料构建名称检索索引。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      }
    },
    {
      "id": "5310bb4f12d9",
      "processor": "database:public.seo_person_priority_index",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "local_public_recognitions",
        "person_officer_stats",
        "persons",
        "politicians",
        "professionals"
      ],
      "outputs": [
        "seo_person_priority_index"
      ],
      "input_evidence": {
        "local_public_recognitions": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ],
        "person_officer_stats": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ],
        "persons": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ],
        "politicians": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ],
        "professionals": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ]
      },
      "output_evidence": {
        "seo_person_priority_index": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_person_priority_index"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " WITH signal_counts AS (\n         SELECT signals.person_id,\n            bool_or(signals.src = 'politician'::text) AS is_politician,\n            bool_or(signals.src = 'professional'::text) AS is_professional,\n            bool_or(signals.src = 'recognition'::text) AS has_public_recognition,\n            count(*) FILTER (WHERE signals.src = 'politician'::text)::integer AS politician_count,\n            count(*) FILTER (WHERE signals.src = 'professional'::text)::integer AS professional_count,\n            count(*) FILTER (WHERE signals.src = 'recognition'::text)::integer AS public_recognition_count\n           FROM ( SELECT person_officer_stats.person_id,\n                    'officer'::text AS src\n                   FROM person_officer_stats\n                  WHERE person_officer_stats.person_id IS NOT NULL\n                UNION ALL\n                 SELECT politicians.person_id,\n                    'politician'::text AS src\n                   FROM politicians\n                  WHERE politicians.person_id IS NOT NULL\n                UNION ALL\n                 SELECT professionals.person_id,\n                    'professional'::text AS src\n                   FROM professionals\n                  WHERE professionals.person_id IS NOT NULL\n                UNION ALL\n                 SELECT local_public_recognitions.person_id,\n                    'recognition'::text AS src\n                   FROM local_public_recognitions\n                  WHERE local_public_recognitions.person_id IS NOT NULL) signals\n          GROUP BY signals.person_id\n        )\n SELECT p.id,\n    p.display_name,\n    p.name_kana,\n    p.name_en,\n    p.created_at,\n    COALESCE(pos.updated_at::date, p.created_at::date) AS last_modified,\n    COALESCE(pos.n_companies, 0) AS n_companies,\n    COALESCE(pos.n_listed_companies, 0) AS n_listed_companies,\n    COALESCE(pos.n_current_positions, 0) AS n_current_positions,\n    COALESCE(pos.n_past_positions, 0) AS n_past_positions,\n    COALESCE(pos.prestige_score::integer, 0) AS prestige_score,\n    pos.current_companies,\n    signal_counts.is_politician,\n    signal_counts.is_professional,\n    signal_counts.has_public_recognition,\n    signal_counts.politician_count,\n    signal_counts.professional_count,\n    signal_counts.public_recognition_count\n   FROM signal_counts\n     JOIN persons p ON p.id = signal_counts.person_id\n     LEFT JOIN person_officer_stats pos ON pos.person_id = p.id\n  WHERE COALESCE(p.display_policy, 'public'::character varying)::text <> 'hidden'::text AND COALESCE(p.status, 'active'::character varying)::text <> 'invalid'::text AND p.merged_into_id IS NULL AND p.display_name IS NOT NULL;",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_person_priority_index": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "综合已有经营或人物证据构建优先级索引，供站点地图或页面检索使用。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      }
    },
    {
      "id": "e85ad83c41ab",
      "processor": "database:public.seo_person_sitemap_prefixes",
      "processor_kind": "materialized_view",
      "status": "confirmed_definition",
      "inputs": [
        "seo_person_priority_index"
      ],
      "outputs": [
        "seo_person_sitemap_prefixes"
      ],
      "input_evidence": {
        "seo_person_priority_index": [
          {
            "kind": "pg_depend",
            "origin": "database",
            "object": "database:public.seo_person_sitemap_prefixes"
          }
        ]
      },
      "output_evidence": {
        "seo_person_sitemap_prefixes": [
          {
            "kind": "pg_get_viewdef",
            "origin": "database",
            "object": "database:public.seo_person_sitemap_prefixes"
          }
        ]
      },
      "dimensions": [
        5
      ],
      "scope_note": "数据库依赖定义与显式刷新代码均已确认；ubuntu crontab 配置每日启动刷新入口。找到的成功报告为 2026-06-15，不能据此认定最近每天均刷新成功；未执行刷新程序。",
      "definition": " SELECT SUBSTRING(lpad(id::text, 10, '0'::text) FROM 1 FOR 6) AS id,\n    count(*) AS count\n   FROM seo_person_priority_index\n  GROUP BY (SUBSTRING(lpad(id::text, 10, '0'::text) FROM 1 FOR 6));",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_person_sitemap_prefixes": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "按前缀分组生成站点地图分片索引，供相关页面被搜索引擎发现。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      },
      "refresh_evidence": {
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      }
    },
    {
      "id": "aea8645b98fd",
      "processor": "database:public.refresh_seo_company_priority_sitemap_index()",
      "processor_kind": "database_function",
      "status": "confirmed_definition",
      "inputs": [
        "awards",
        "business_licenses",
        "certifications",
        "companies",
        "court_case_company_links",
        "gov_revolving_door",
        "government_contracts",
        "intellectual_properties",
        "invoice_registrants",
        "kanpo_notices",
        "local_public_recognitions",
        "officers",
        "political_donations",
        "politician_corporate_links",
        "seo_company_priority_sitemap_index"
      ],
      "outputs": [
        "seo_company_priority_sitemap_index"
      ],
      "input_evidence": {
        "companies": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 15,
            "origin": "database",
            "kind": "sql_read"
          },
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 26,
            "origin": "database",
            "kind": "sql_read"
          },
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 236,
            "origin": "database",
            "kind": "sql_read"
          },
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 290,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "court_case_company_links": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 41,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "gov_revolving_door": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 56,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "politician_corporate_links": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 71,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "government_contracts": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 86,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "political_donations": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 101,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "kanpo_notices": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 116,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "business_licenses": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 131,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "certifications": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 146,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "awards": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 161,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "local_public_recognitions": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 176,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "officers": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 191,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "invoice_registrants": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 207,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "intellectual_properties": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 223,
            "origin": "database",
            "kind": "sql_read"
          }
        ],
        "seo_company_priority_sitemap_index": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 259,
            "origin": "database",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "seo_company_priority_sitemap_index": [
          {
            "file": "database:public.refresh_seo_company_priority_sitemap_index()",
            "line": 261,
            "origin": "database",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1
      ],
      "scope_note": "数据库当前函数定义确认其读取／写入能力；没有执行此函数，也未证明其调用时间、调用频率或最近运行成功。",
      "definition": "CREATE OR REPLACE FUNCTION public.refresh_seo_company_priority_sitemap_index()\n RETURNS integer\n LANGUAGE plpgsql\nAS $function$\nDECLARE\n  inserted_count integer := 0;\nBEGIN\n  CREATE TEMP TABLE _seo_company_priority_candidates (\n    corporate_number char(13) PRIMARY KEY,\n    weight integer NOT NULL\n  ) ON COMMIT DROP;\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 100\n  FROM companies\n  WHERE status = 'active'\n    AND is_listed = true\n    AND corporate_number IS NOT NULL\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 92\n  FROM (\n    SELECT corporate_number\n    FROM companies\n    WHERE status = 'active'\n      AND has_risk_events = true\n      AND corporate_number IS NOT NULL\n    LIMIT 12000\n  ) risk_companies\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 90\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM court_case_company_links\n      WHERE corporate_number IS NOT NULL\n      ORDER BY event_date DESC NULLS LAST\n      LIMIT 16000\n    ) recent_court_cases\n  ) court_cases\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 89\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM gov_revolving_door\n      WHERE corporate_number IS NOT NULL\n      ORDER BY is_current DESC NULLS LAST, appointed_at DESC NULLS LAST\n      LIMIT 10000\n    ) revolving_door_rows\n  ) revolving_door\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 88\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM politician_corporate_links\n      WHERE corporate_number IS NOT NULL\n      ORDER BY match_confidence DESC NULLS LAST, corporate_number\n      LIMIT 10000\n    ) pep_link_rows\n  ) pep_links\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 86\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM government_contracts\n      WHERE corporate_number IS NOT NULL\n      ORDER BY contract_date DESC NULLS LAST\n      LIMIT 18000\n    ) recent_contracts\n  ) contracts\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 85\n  FROM (\n    SELECT DISTINCT donor_corporate_number AS corporate_number\n    FROM (\n      SELECT donor_corporate_number\n      FROM political_donations\n      WHERE donor_corporate_number IS NOT NULL\n      ORDER BY donation_date DESC NULLS LAST, fiscal_year DESC NULLS LAST\n      LIMIT 10000\n    ) political_donation_rows\n  ) political_donations\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 84\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM kanpo_notices\n      WHERE corporate_number IS NOT NULL\n      ORDER BY published_on DESC NULLS LAST\n      LIMIT 12000\n    ) recent_kanpo\n  ) kanpo\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 80\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM business_licenses\n      WHERE corporate_number IS NOT NULL\n      ORDER BY corporate_number\n      LIMIT 12000\n    ) license_rows\n  ) licenses\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 78\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM certifications\n      WHERE corporate_number IS NOT NULL\n      ORDER BY corporate_number\n      LIMIT 10000\n    ) certification_rows\n  ) certifications\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 76\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM awards\n      WHERE corporate_number IS NOT NULL\n      ORDER BY awarded_at DESC NULLS LAST\n      LIMIT 10000\n    ) award_rows\n  ) awards\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 75\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM local_public_recognitions\n      WHERE corporate_number IS NOT NULL\n      ORDER BY event_date DESC NULLS LAST, published_at DESC NULLS LAST\n      LIMIT 10000\n    ) recognition_rows\n  ) recognitions\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 74\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM officers\n      WHERE corporate_number IS NOT NULL\n        AND is_current = true\n      ORDER BY corporate_number\n      LIMIT 12000\n    ) officer_rows\n  ) officer_companies\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 70\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM invoice_registrants\n      WHERE corporate_number IS NOT NULL\n        AND invalid_date IS NULL\n      ORDER BY corporate_number\n      LIMIT 12000\n    ) invoice_rows\n  ) invoice_companies\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 68\n  FROM (\n    SELECT DISTINCT corporate_number\n    FROM (\n      SELECT corporate_number\n      FROM intellectual_properties\n      WHERE corporate_number IS NOT NULL\n      ORDER BY corporate_number\n      LIMIT 10000\n    ) ip_rows\n  ) ip_companies\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  INSERT INTO _seo_company_priority_candidates (corporate_number, weight)\n  SELECT corporate_number, 66\n  FROM (\n    SELECT corporate_number\n    FROM companies\n    WHERE status = 'active'\n      AND popularity_score > 0\n      AND corporate_number IS NOT NULL\n    ORDER BY popularity_score DESC NULLS LAST\n    LIMIT 25000\n  ) popular\n  ON CONFLICT (corporate_number)\n  DO UPDATE SET weight = GREATEST(_seo_company_priority_candidates.weight, EXCLUDED.weight);\n\n  CREATE TEMP TABLE _seo_company_priority_top (\n    corporate_number char(13) PRIMARY KEY,\n    weight integer NOT NULL\n  ) ON COMMIT DROP;\n\n  INSERT INTO _seo_company_priority_top (corporate_number, weight)\n  SELECT corporate_number, weight\n  FROM _seo_company_priority_candidates\n  ORDER BY weight DESC, corporate_number\n  LIMIT 60000;\n\n  ANALYZE _seo_company_priority_top;\n\n  DELETE FROM seo_company_priority_sitemap_index;\n\n  INSERT INTO seo_company_priority_sitemap_index (\n    corporate_number,\n    last_modified,\n    is_listed,\n    risk_score,\n    popularity_score,\n    has_risk_events,\n    invoice_status,\n    weight\n  )\n  SELECT c.corporate_number,\n         COALESCE(c.last_updated_at::date, c.assignment_date, c.first_seen_at::date) AS last_modified,\n         c.is_listed,\n         c.risk_score,\n         c.popularity_score,\n         c.has_risk_events,\n         c.invoice_status,\n         candidates.weight\n  FROM _seo_company_priority_top candidates\n  JOIN LATERAL (\n    SELECT c.corporate_number,\n           c.last_updated_at,\n           c.assignment_date,\n           c.first_seen_at,\n           c.is_listed,\n           c.risk_score,\n           c.popularity_score,\n           c.has_risk_events,\n           c.invoice_status\n    FROM companies c\n    WHERE c.corporate_number = candidates.corporate_number\n      AND c.status = 'active'\n      AND c.name IS NOT NULL\n    LIMIT 1\n  ) c ON true\n  ORDER BY candidates.weight DESC,\n           c.is_listed DESC,\n           c.risk_score DESC NULLS LAST,\n           c.popularity_score DESC NULLS LAST,\n           c.corporate_number\n  LIMIT 60000;\n\n  GET DIAGNOSTICS inserted_count = ROW_COUNT;\n  RETURN inserted_count;\nEND;\n$function$\n",
      "schedule_lookup": null,
      "schedule_plans": [],
      "output_roles": {
        "seo_company_priority_sitemap_index": "搜索／展示用物化结果"
      },
      "description": {
        "summary": "综合已有经营或人物证据构建优先级索引，供站点地图或页面检索使用。",
        "origin": "database_definition",
        "scope_note": "依据数据库当前定义；没有执行或刷新该对象。",
        "evidence_file": "evidence/processing_snapshot.json"
      }
    },
    {
      "id": "a47963d9fa9d",
      "processor": "backend/scripts/seed_data_sources.py",
      "processor_kind": "shared_administration",
      "status": "confirmed_code",
      "inputs": [
        "data_sources"
      ],
      "outputs": [
        "data_sources"
      ],
      "input_evidence": {
        "data_sources": [
          {
            "file": "backend/scripts/seed_data_sources.py",
            "line": 599,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/seed_data_sources.py",
            "line": 603,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "data_sources": [
          {
            "file": "backend/scripts/seed_data_sources.py",
            "line": 577,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "公共管理／调度链路，不是某一个外部 source 的采集结果。能力依据部署代码；不代表每个管理操作均在自动执行。",
      "schedule_lookup": "backend/scripts/seed_data_sources.py",
      "schedule_plans": [],
      "output_roles": {
        "data_sources": "来源登记元数据"
      },
      "description": {
        "summary": "将预设来源元信息登记或更新到来源表，是公共元数据管理程序。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "把 P0 数据源元信息写入 data_sources 表.",
        "evidence": [
          {
            "file": "backend/scripts/seed_data_sources.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/seed_data_sources.py",
            "line": 572,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "b2ecdd51724d76be2b11144f16e704e65dd9e824a5b164eb247eb2a7aac5030e",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "62d54d8bf6aa",
      "processor": "backend/scripts/seed_field_lineage.py",
      "processor_kind": "shared_administration",
      "status": "confirmed_code",
      "inputs": [
        "field_lineage"
      ],
      "outputs": [
        "field_lineage"
      ],
      "input_evidence": {
        "field_lineage": [
          {
            "file": "backend/scripts/seed_field_lineage.py",
            "line": 394,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/seed_field_lineage.py",
            "line": 396,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "field_lineage": [
          {
            "file": "backend/scripts/seed_field_lineage.py",
            "line": 386,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "公共管理／调度链路，不是某一个外部 source 的采集结果。能力依据部署代码；不代表每个管理操作均在自动执行。",
      "schedule_lookup": "backend/scripts/seed_field_lineage.py",
      "schedule_plans": [],
      "output_roles": {
        "field_lineage": "字段溯源元数据"
      },
      "description": {
        "summary": "登记业务字段与来源、解析器及说明之间的声明关系，供字段溯源使用；声明不等于实际执行证据。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Populate field_lineage table — 每个字段从哪个源、用什么 parser 抓的.",
        "evidence": [
          {
            "file": "backend/scripts/seed_field_lineage.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/seed_field_lineage.py",
            "line": 379,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "a4b2e45124c3a2b2dfe7793a9d03bbf80990b368cb73b6c2aadf91fdf1955bcf",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "33dfc1d3ea40",
      "processor": "backend/scripts/seed_field_lineage_extras.py",
      "processor_kind": "shared_administration",
      "status": "confirmed_code",
      "inputs": [
        "field_lineage"
      ],
      "outputs": [
        "field_lineage"
      ],
      "input_evidence": {
        "field_lineage": [
          {
            "file": "backend/scripts/seed_field_lineage_extras.py",
            "line": 531,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "field_lineage": [
          {
            "file": "backend/scripts/seed_field_lineage_extras.py",
            "line": 513,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "公共管理／调度链路，不是某一个外部 source 的采集结果。能力依据部署代码；不代表每个管理操作均在自动执行。",
      "schedule_lookup": "backend/scripts/seed_field_lineage_extras.py",
      "schedule_plans": [],
      "output_roles": {
        "field_lineage": "字段溯源元数据"
      },
      "description": {
        "summary": "补充尚缺说明的表字段溯源声明，按字段键更新来源及解析说明。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "Seed field_lineage rows for the 28 tables missing column descriptions.",
        "evidence": [
          {
            "file": "backend/scripts/seed_field_lineage_extras.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/seed_field_lineage_extras.py",
            "line": 492,
            "symbol": "main",
            "origin": "online"
          }
        ],
        "code_sha256": "f26ea9cbfbf9eacf2f6e003d8835b00d2a7b45373962f67974af557c086160ed",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "63eed80110fa",
      "processor": "backend/scripts/run_scheduler.py",
      "processor_kind": "shared_administration",
      "status": "confirmed_code",
      "inputs": [
        "scheduler_runs"
      ],
      "outputs": [
        "scheduler_runs"
      ],
      "input_evidence": {
        "scheduler_runs": [
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 151,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 357,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "scheduler_runs": [
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 85,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 99,
            "origin": "online",
            "kind": "sql_write"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 118,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "公共管理／调度链路，不是某一个外部 source 的采集结果。能力依据部署代码；不代表每个管理操作均在自动执行。",
      "schedule_lookup": "backend/scripts/run_scheduler.py",
      "schedule_plans": [],
      "output_roles": {
        "scheduler_runs": "调度执行记录"
      },
      "description": {
        "summary": "读取调度配置，按 cron 启动子进程并控制超时，向调度运行表记录状态和日志尾部。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "tyc-japan production scheduler.",
        "evidence": [
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 2,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 81,
            "symbol": "_insert_run",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 186,
            "symbol": "run_job",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 432,
            "symbol": "cmd_run_once",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 466,
            "symbol": "main",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 77,
            "symbol": "_db_conn",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 95,
            "symbol": "_mark_started",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 107,
            "symbol": "_mark_finished",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 141,
            "symbol": "_effective_timeout_min",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 178,
            "symbol": "_tail",
            "origin": "online"
          },
          {
            "file": "backend/scripts/run_scheduler.py",
            "line": 275,
            "symbol": "load_schedule",
            "origin": "online"
          }
        ],
        "code_sha256": "fd0aa7a40e0ff8641c4865f689ff3138589ea811ac257dabee42775e8ea4922e",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    },
    {
      "id": "82c3b30e7816",
      "processor": "backend/quality/checks.py",
      "processor_kind": "shared_administration",
      "status": "confirmed_code",
      "inputs": [
        "companies",
        "crawl_jobs",
        "data_sources",
        "risk_events"
      ],
      "outputs": [
        "data_quality_metrics"
      ],
      "input_evidence": {
        "risk_events": [
          {
            "file": "backend/quality/checks.py",
            "line": 209,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 231,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "data_sources": [
          {
            "file": "backend/quality/checks.py",
            "line": 210,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 231,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 345,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "crawl_jobs": [
          {
            "file": "backend/quality/checks.py",
            "line": 343,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 344,
            "origin": "online",
            "kind": "sql_read"
          }
        ],
        "companies": [
          {
            "file": "backend/quality/checks.py",
            "line": 401,
            "origin": "online",
            "kind": "sql_read"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 415,
            "origin": "online",
            "kind": "sql_read"
          }
        ]
      },
      "output_evidence": {
        "data_quality_metrics": [
          {
            "file": "backend/quality/checks.py",
            "line": 583,
            "origin": "online",
            "kind": "sql_write"
          }
        ]
      },
      "dimensions": [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10,
        11
      ],
      "scope_note": "公共管理／调度链路，不是某一个外部 source 的采集结果。能力依据部署代码；不代表每个管理操作均在自动执行。",
      "schedule_lookup": "backend/quality/checks.py",
      "schedule_plans": [],
      "output_roles": {
        "data_quality_metrics": "质量检查结果"
      },
      "description": {
        "summary": "对重复、字段空值、法人关联覆盖、增长异常和采集陈旧等情况运行质量检查，写入质量指标。",
        "origin": "online",
        "code_available": true,
        "document_excerpt": "数据质量检查 — 全表扫描产出 metrics 入库.",
        "evidence": [
          {
            "file": "backend/quality/checks.py",
            "line": 1,
            "symbol": "module_docstring",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 531,
            "symbol": "run_all_checks",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 578,
            "symbol": "save_metrics",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 92,
            "symbol": "severity",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 121,
            "symbol": "check_dup_rate",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 176,
            "symbol": "check_coverage_pct",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 200,
            "symbol": "check_risk_events_coverage_filtered",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 250,
            "symbol": "check_null_rate",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 281,
            "symbol": "_expected_interval_hours",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 310,
            "symbol": "_load_schedule_intervals",
            "origin": "online"
          },
          {
            "file": "backend/quality/checks.py",
            "line": 331,
            "symbol": "check_crawler_stale",
            "origin": "online"
          }
        ],
        "code_sha256": "3e2b24a5a71e553833bf0fb001f7c2cdf02010f41dad17109f94ff9c4b0758ed",
        "sources": [],
        "business_outputs": [],
        "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
        "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
      }
    }
  ],
  "unresolved_processing_tables": [
    {
      "table": "company_address_aza_matches",
      "dimensions": [
        3
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_co_major_shareholder",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_contract_profile",
      "dimensions": [
        2,
        11
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_family_control",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_financial_quality",
      "dimensions": [
        11
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_industry_rank",
      "dimensions": [
        2,
        11
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_interlocks",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_intl_profile",
      "dimensions": [
        2,
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_key_persons",
      "dimensions": [
        5
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_management_stability",
      "dimensions": [
        5,
        7
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_pep_profile",
      "dimensions": [
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_professional_staff",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_profile_card",
      "dimensions": [
        1
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_risk_dashboard",
      "dimensions": [
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_same_address",
      "dimensions": [
        3
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_subsidiary_closure",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_ubo",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "company_vitality_score",
      "dimensions": [
        11
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "compliance_check_decisions",
      "dimensions": [
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "corp_keiretsu_cluster",
      "dimensions": [
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "executive_compensation",
      "dimensions": [
        5,
        11
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "gov_revolving_door",
      "dimensions": [
        5,
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "material_disclosures",
      "dimensions": [
        8
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_career_trajectory",
      "dimensions": [
        5,
        7
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_co_occurrence",
      "dimensions": [
        5,
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_multi_license",
      "dimensions": [
        6,
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_officer_stats",
      "dimensions": [
        5,
        6
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_profile",
      "dimensions": [
        5
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_serial_entrepreneur",
      "dimensions": [
        5
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "person_shared_address",
      "dimensions": [
        3,
        5
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    },
    {
      "table": "politician_corporate_links",
      "dimensions": [
        5,
        10
      ],
      "reason": "已确认数据库对象存在，但当前可读部署代码和数据库定义未建立可靠加工程序与输入表关系；未根据表名或历史计划猜测箭头。",
      "inputs": [],
      "processor": null
    }
  ],
  "unresolved_auxiliary_tables": [],
  "partition_routing": [
    {
      "parent": "crawl_jobs",
      "partition": "crawl_jobs_2026_05",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "crawl_jobs",
      "partition": "crawl_jobs_2026_06",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "crawl_jobs",
      "partition": "crawl_jobs_default",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "news_mentions",
      "partition": "news_mentions_2026",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "news_mentions",
      "partition": "news_mentions_default",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "raw_documents",
      "partition": "raw_documents_2026_05",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "raw_documents",
      "partition": "raw_documents_2026_06",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "raw_documents",
      "partition": "raw_documents_default",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "risk_events",
      "partition": "risk_events_2024",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "risk_events",
      "partition": "risk_events_2025",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "risk_events",
      "partition": "risk_events_2026",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    },
    {
      "parent": "risk_events",
      "partition": "risk_events_default",
      "kind": "partition_routing",
      "evidence": "pg_inherits"
    }
  ],
  "auxiliary_table_roles": {
    "address_base_registry_files": "地址主数据下载批次",
    "bid_notice_crawl_segments": "采集分段／断点",
    "company_geocode_attempts": "地理编码尝试／重试状态",
    "crawl_jobs": "爬虫执行记录",
    "data_quality_metrics": "质量检查结果",
    "data_sources": "来源登记元数据",
    "entity_resolution_cache": "实体匹配缓存",
    "field_lineage": "字段溯源元数据",
    "gbizinfo_html_done": "处理完成标记／检查点",
    "gbizinfo_representative_done": "处理完成标记／检查点",
    "geps_representative_done": "处理完成标记／检查点",
    "jgoodtech_representative_done": "处理完成标记／检查点",
    "kaigo_service_rep_done": "处理完成标记／检查点",
    "kanpo_discovered_urls": "官报待抓取 URL 队列",
    "kanpo_downstream_links": "官报派生结果关联",
    "local_public_recognition_root_runs": "公告入口运行记录",
    "partnership_declaration_pdf_done": "处理完成标记／检查点",
    "raw_documents": "原文归档／解析状态",
    "scheduler_runs": "调度执行记录",
    "wam_disability_rep_done": "处理完成标记／检查点"
  },
  "displayed_table_inventory": [
    "address_base_aza",
    "address_base_registry_files",
    "address_clusters",
    "appraisal_reports",
    "awards",
    "bid_notice_crawl_segments",
    "bid_notices",
    "business_licenses",
    "care_facilities",
    "certifications",
    "companies",
    "companies_virtual_office_match",
    "company_address_aza_matches",
    "company_aliases",
    "company_associations",
    "company_business_model",
    "company_business_purpose",
    "company_business_scope",
    "company_changes",
    "company_co_major_shareholder",
    "company_contract_profile",
    "company_family_control",
    "company_financial_quality",
    "company_foreign_capital",
    "company_geo_density_grid",
    "company_geocode_attempts",
    "company_geocodes",
    "company_industry_inferred",
    "company_industry_rank",
    "company_interlocks",
    "company_intl_profile",
    "company_ip_profile",
    "company_key_persons",
    "company_location_profiles",
    "company_management_stability",
    "company_paper_co_flag",
    "company_pep_profile",
    "company_professional_staff",
    "company_profile_card",
    "company_registered_profiles",
    "company_relationships",
    "company_risk_dashboard",
    "company_same_address",
    "company_subpage_data",
    "company_subsidiary_closure",
    "company_ubo",
    "company_vitality_score",
    "company_website_data",
    "company_wikidata",
    "compliance_check_batches",
    "compliance_check_decisions",
    "compliance_check_evidence",
    "compliance_check_targets",
    "construction_licenses",
    "corp_keiretsu_cluster",
    "court_case_company_links",
    "court_case_facts",
    "court_case_judges",
    "court_hanrei_pdf_parses",
    "crawl_jobs",
    "crawl_jobs_2026_05",
    "crawl_jobs_2026_06",
    "crawl_jobs_default",
    "cross_listings",
    "data_quality_metrics",
    "data_sources",
    "disability_welfare_facilities",
    "edinet_filings",
    "entity_resolution_cache",
    "executive_compensation",
    "external_data_source_discoveries",
    "field_lineage",
    "financial_statements",
    "food_business_licenses",
    "gbizinfo_html_done",
    "gbizinfo_representative_done",
    "geps_representative_done",
    "gis_facility_points",
    "gis_zone_polygons",
    "gov_revolving_door",
    "government_contracts",
    "government_procurement_suspensions",
    "hotel_ryokan_registry",
    "intellectual_properties",
    "invoice_registrants",
    "ipa_security_action_declarations",
    "jetro_case_studies",
    "jftc_subcontract_recommendations",
    "jgoodtech_company_profiles",
    "jgoodtech_representative_done",
    "jpo_trademark_enrichment",
    "kaigo_service_rep_done",
    "kaken_research_projects",
    "kanpo_discovered_urls",
    "kanpo_downstream_links",
    "kanpo_financial_facts",
    "kanpo_issues",
    "kanpo_notice_entities",
    "kanpo_notices",
    "kanpo_source_records",
    "land_prices",
    "laws",
    "legal_registry_requests",
    "local_public_recognition_root_runs",
    "local_public_recognitions",
    "material_disclosures",
    "medical_facilities",
    "moj_e_koukoku_notice_documents",
    "moj_e_koukoku_notices",
    "municipalities_lookup",
    "mv_company_risk_summary",
    "news_mentions",
    "news_mentions_2026",
    "news_mentions_default",
    "nintei_shien_kikan_records",
    "npo_facilities",
    "officers",
    "partnership_declaration_pdf_done",
    "person_career_trajectory",
    "person_co_occurrence",
    "person_multi_license",
    "person_officer_stats",
    "person_profile",
    "person_serial_entrepreneur",
    "person_shared_address",
    "persons",
    "pharmacy_registry",
    "political_donations",
    "political_organization_reports",
    "politician_corporate_links",
    "politicians",
    "population_mesh_250m",
    "professionals",
    "public_representative_clues",
    "raw_documents",
    "raw_documents_2026_05",
    "raw_documents_2026_06",
    "raw_documents_default",
    "real_estate_transactions",
    "risk_events",
    "risk_events_2024",
    "risk_events_2025",
    "risk_events_2026",
    "risk_events_default",
    "scheduler_runs",
    "school_institution",
    "seo_company_name_bucket_rank",
    "seo_company_name_index",
    "seo_company_priority_sitemap_index",
    "seo_company_sitemap_prefixes",
    "seo_invoice_sitemap_prefixes",
    "seo_person_name_bucket_rank",
    "seo_person_name_index",
    "seo_person_priority_index",
    "seo_person_sitemap_prefixes",
    "shareholders",
    "smart_sme_supporters",
    "station_passengers",
    "subsidy_programs",
    "university_startups",
    "virtual_office_locations",
    "virtual_organizations",
    "wam_disability_rep_done",
    "workforce_disclosures",
    "zoning_areas"
  ],
  "processing_metadata": {
    "checked_at": "2026-11-03T08:40:21.438139+00:00",
    "direct_business_tables": 81,
    "auxiliary_tables_displayed": 20,
    "auxiliary_tables_with_writers": 20,
    "processing_programs_or_definitions": 45,
    "processing_output_tables": 46,
    "new_processing_output_tables": 21,
    "unresolved_processing_tables": 31,
    "total_displayed_tables": 165,
    "database_base_tables": 226,
    "database_materialized_views": 9,
    "read_only": "on",
    "scope_note": "保留原有直接采集关系；派生加工、辅助写入和分区路由分别展示，不把表到表加工伪装为新的外部来源。"
  },
  "table_latest_increments": {
    "address_base_aza": {
      "latest_related_run": {
        "task": "address_base_registry_aza",
        "run_id": 25322,
        "started_at": "2026-10-02T19:20:00.281065+00:00",
        "finished_at": "2026-10-02T19:21:39.254914+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/address_base_registry_aza_20261002_192000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/address_base_registry.py"
        ],
        "source_codes": [
          "address_base_registry_aza"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-02 19:21:35,341 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727431, 'source_file_id': 1, 'raw_doc_id': 4534727, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727431}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167858,
        "table": "address_base_aza",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 727431,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted_rows"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "address_base_registry_aza",
        "run_id": 25322,
        "started_at": "2026-10-02T19:20:00.281065+00:00",
        "finished_at": "2026-10-02T19:21:39.254914+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/address_base_registry_aza_20261002_192000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/address_base_registry.py"
        ],
        "source_codes": [
          "address_base_registry_aza"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-02 19:21:35,341 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727431, 'source_file_id': 1, 'raw_doc_id': 4534727, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727431}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167858,
        "table": "address_base_aza",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 727431,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted_rows"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "address_base_registry_aza",
          "run_id": 25322,
          "started_at": "2026-10-02T19:20:00.281065+00:00",
          "finished_at": "2026-10-02T19:21:39.254914+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/address_base_registry_aza_20261002_192000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/address_base_registry.py"
          ],
          "source_codes": [
            "address_base_registry_aza"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-02 19:21:35,341 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727431, 'source_file_id': 1, 'raw_doc_id': 4534727, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727431}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 167858,
          "table": "address_base_aza",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 727431,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted_rows"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "address_base_registry_aza",
          "run_id": 19628,
          "started_at": "2026-09-02T19:20:00.762422+00:00",
          "finished_at": "2026-09-02T19:21:51.815578+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/address_base_registry.py"
          ],
          "source_codes": [
            "address_base_registry_aza"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-02 19:21:38,425 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727418, 'source_file_id': 1, 'raw_doc_id': 3821050, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727418}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 156553,
          "table": "address_base_aza",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 727418,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted_rows"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "address_base_registry_files": {
      "latest_related_run": {
        "task": "address_base_registry_aza",
        "run_id": 25322,
        "started_at": "2026-10-02T19:20:00.281065+00:00",
        "finished_at": "2026-10-02T19:21:39.254914+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/address_base_registry_aza_20261002_192000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/address_base_registry.py"
        ],
        "source_codes": [
          "address_base_registry_aza"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-02 19:21:35,341 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727431, 'source_file_id': 1, 'raw_doc_id': 4534727, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727431}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167858,
        "table": "address_base_registry_files",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "address_base_registry_aza",
          "run_id": 25322,
          "started_at": "2026-10-02T19:20:00.281065+00:00",
          "finished_at": "2026-10-02T19:21:39.254914+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/address_base_registry_aza_20261002_192000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/address_base_registry.py"
          ],
          "source_codes": [
            "address_base_registry_aza"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-02 19:21:35,341 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727431, 'source_file_id': 1, 'raw_doc_id': 4534727, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727431}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 167858,
          "table": "address_base_registry_files",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "address_base_registry_aza",
          "run_id": 19628,
          "started_at": "2026-09-02T19:20:00.762422+00:00",
          "finished_at": "2026-09-02T19:21:51.815578+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/address_base_registry.py"
          ],
          "source_codes": [
            "address_base_registry_aza"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-02 19:21:38,425 INFO address_base_registry DONE {'parser_version': 'address_base_registry_aza_v1', 'csv_name': 'mt_town_all.csv', 'csv_fields': 38, 'records_parsed': 727418, 'source_file_id': 1, 'raw_doc_id': 3821050, 'archive_raw_s3': False, 'deleted_rows': 0, 'inserted_rows': 727418}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 156553,
          "table": "address_base_registry_files",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "address_clusters": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "appraisal_reports": {
      "latest_related_run": {
        "task": "reinfolib",
        "run_id": 31155,
        "started_at": "2026-11-02T09:10:00.961644+00:00",
        "finished_at": "2026-11-02T09:56:32.321609+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/reinfolib_20261102_091000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/reinfolib_incremental.py"
        ],
        "source_codes": [
          "reinfolib"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "appraisal_reports",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "reinfolib",
          "run_id": 31155,
          "started_at": "2026-11-02T09:10:00.961644+00:00",
          "finished_at": "2026-11-02T09:56:32.321609+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/reinfolib_20261102_091000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/reinfolib_incremental.py"
          ],
          "source_codes": [
            "reinfolib"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "appraisal_reports",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "reinfolib",
          "run_id": 30950,
          "started_at": "2026-11-01T09:10:00.912234+00:00",
          "finished_at": "2026-11-01T09:57:43.224038+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/reinfolib_incremental.py"
          ],
          "source_codes": [
            "reinfolib"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "appraisal_reports",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "awards": {
      "latest_related_run": {
        "task": "local_public_recognitions",
        "run_id": 31094,
        "started_at": "2026-11-02T00:35:00.091245+00:00",
        "finished_at": "2026-11-02T00:36:20.186381+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/local_public_recognitions.py"
        ],
        "source_codes": [
          "local_public_recognitions"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": null,
        "table": "awards",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "local_public_recognitions",
          "run_id": 31094,
          "started_at": "2026-11-02T00:35:00.091245+00:00",
          "finished_at": "2026-11-02T00:36:20.186381+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "awards",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "local_public_recognitions",
          "run_id": 30887,
          "started_at": "2026-11-01T00:35:00.171521+00:00",
          "finished_at": "2026-11-01T00:36:33.36691+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 80,\n  \"fetched\": 80,\n  \"parsed\": 0,\n  \"inserted\": 0,\n  \"updated\": 0,\n  \"mirrored_awards\": 0,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "awards",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "mhlw_positive_ryouritsu",
          "run_id": 25346,
          "started_at": "2026-10-02T21:20:00.807042+00:00",
          "finished_at": "2026-10-02T21:50:06.0115+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/mhlw_positive_ryouritsu_20261002_212000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/mhlw_positive_ryouritsu.py"
          ],
          "source_codes": [
            "mhlw_positive_ryouritsu"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "awards",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "mhlw_positive_ryouritsu",
          "run_id": 19654,
          "started_at": "2026-09-02T21:20:00.261482+00:00",
          "finished_at": "2026-09-02T21:36:21.481224+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/mhlw_positive_ryouritsu.py"
          ],
          "source_codes": [
            "mhlw_positive_ryouritsu"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": "2026-09-02 21:36:21,049 INFO mhlw_positive_ryouritsu DONE {'parser_version': 'mhlw_positive_ryouritsu_v1', 'csv_name': '99_20260903_utf8.csv', 'csv_update_date': '2026-09-03', 'csv_fields': 236, 'records_parsed': 65159, 'certifications_parsed': 6320, 'awards_parsed': 270, 'deleted_workforce': 64620, 'deleted_certifications': 6230, 'deleted_awards': 271, 'inserted_workforce': 65159, 'inserted_certifications': 6320, 'inserted_awards': 270, 'no_match_corp': 12}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 156577,
          "table": "awards",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "bid_notice_crawl_segments": {
      "latest_related_run": {
        "task": "kkj_bid_notices",
        "run_id": 31008,
        "started_at": "2026-11-01T17:15:00.123651+00:00",
        "finished_at": "2026-11-01T17:21:11.729648+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kkj_bid_notices_20261101_171500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/kkj_bid_notices.py"
        ],
        "source_codes": [
          "kkj_bid_notices"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 17:21:11,657 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 585, 'new': 8, 'updated': 576, 'errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179143,
        "table": "bid_notice_crawl_segments",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "kkj_bid_notices",
          "run_id": 31008,
          "started_at": "2026-11-01T17:15:00.123651+00:00",
          "finished_at": "2026-11-01T17:21:11.729648+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kkj_bid_notices_20261101_171500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kkj_bid_notices.py"
          ],
          "source_codes": [
            "kkj_bid_notices"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 17:21:11,657 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 585, 'new': 8, 'updated': 576, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179143,
          "table": "bid_notice_crawl_segments",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "kkj_bid_notices",
          "run_id": 30803,
          "started_at": "2026-10-31T17:15:00.131535+00:00",
          "finished_at": "2026-10-31T17:22:34.773022+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/kkj_bid_notices.py"
          ],
          "source_codes": [
            "kkj_bid_notices"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 17:22:34,699 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 883, 'new': 565, 'updated': 317, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178755,
          "table": "bid_notice_crawl_segments",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "bid_notices": {
      "latest_related_run": {
        "task": "kkj_bid_notices",
        "run_id": 31008,
        "started_at": "2026-11-01T17:15:00.123651+00:00",
        "finished_at": "2026-11-01T17:21:11.729648+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kkj_bid_notices_20261101_171500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/kkj_bid_notices.py"
        ],
        "source_codes": [
          "kkj_bid_notices"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 17:21:11,657 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 585, 'new': 8, 'updated': 576, 'errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179143,
        "table": "bid_notices",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 8,
          "updated": 576,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "kkj_bid_notices",
        "run_id": 31008,
        "started_at": "2026-11-01T17:15:00.123651+00:00",
        "finished_at": "2026-11-01T17:21:11.729648+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kkj_bid_notices_20261101_171500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/kkj_bid_notices.py"
        ],
        "source_codes": [
          "kkj_bid_notices"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 17:21:11,657 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 585, 'new': 8, 'updated': 576, 'errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179143,
        "table": "bid_notices",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 8,
          "updated": 576,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "kkj_bid_notices",
          "run_id": 31008,
          "started_at": "2026-11-01T17:15:00.123651+00:00",
          "finished_at": "2026-11-01T17:21:11.729648+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kkj_bid_notices_20261101_171500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kkj_bid_notices.py"
          ],
          "source_codes": [
            "kkj_bid_notices"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 17:21:11,657 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 585, 'new': 8, 'updated': 576, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179143,
          "table": "bid_notices",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 8,
            "updated": 576,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "kkj_bid_notices",
          "run_id": 30803,
          "started_at": "2026-10-31T17:15:00.131535+00:00",
          "finished_at": "2026-10-31T17:22:34.773022+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/kkj_bid_notices.py"
          ],
          "source_codes": [
            "kkj_bid_notices"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 17:22:34,699 INFO kkj_bid_notices DONE {'segments': 141, 'split_segments': 0, 'overflow_segments': 0, 'fetched': 883, 'new': 565, 'updated': 317, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178755,
          "table": "bid_notices",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 565,
            "updated": 317,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "business_licenses": {
      "latest_related_run": {
        "task": "env_sanpai",
        "run_id": 31061,
        "started_at": "2026-11-01T21:50:00.101599+00:00",
        "finished_at": "2026-11-01T21:51:47.335828+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/env_sanpai_20261101_215000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/env_sanpai.py"
        ],
        "source_codes": [
          "env_sanpai"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 21:51:47,260 INFO env_sanpai DONE: prefs=47 fetched=0 matched_corp=517",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179196,
        "table": "business_licenses",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最终汇总未给出新增／更新／写入操作计数；抓取量、解析量不能替代入库增量。"
      },
      "latest_attributable_run": {
        "task": "jaha_animal_hospitals",
        "run_id": 29893,
        "started_at": "2026-10-26T22:30:02.180645+00:00",
        "finished_at": "2026-10-26T22:49:50.909616+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jaha_animal_hospitals_20261026_223000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jaha_animal_hospitals.py"
        ],
        "source_codes": [
          "jaha_animal_hospitals"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-26 22:49:50,789 INFO jaha_animal_hospitals done counts={'fetched': 681, 'parsed': 681, 'inserted': 681, 'errors': 0, 'skipped_non_hospital': 0} match_outcomes={'sole_prop_or_clinic': 680, 'zero': 1}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 176911,
        "table": "business_licenses",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 681,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "env_sanpai",
          "run_id": 31061,
          "started_at": "2026-11-01T21:50:00.101599+00:00",
          "finished_at": "2026-11-01T21:51:47.335828+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/env_sanpai_20261101_215000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/env_sanpai.py"
          ],
          "source_codes": [
            "env_sanpai"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 21:51:47,260 INFO env_sanpai DONE: prefs=47 fetched=0 matched_corp=517",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179196,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最终汇总未给出新增／更新／写入操作计数；抓取量、解析量不能替代入库增量。"
        },
        {
          "task": "env_sanpai",
          "run_id": 30859,
          "started_at": "2026-10-31T21:50:00.102894+00:00",
          "finished_at": "2026-10-31T21:51:47.061631+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/env_sanpai.py"
          ],
          "source_codes": [
            "env_sanpai"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 21:51:46,989 INFO env_sanpai DONE: prefs=47 fetched=0 matched_corp=517",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178810,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最终汇总未给出新增／更新／写入操作计数；抓取量、解析量不能替代入库增量。"
        },
        {
          "task": "real_estate_appraisers",
          "run_id": 30109,
          "started_at": "2026-10-28T00:00:00.240064+00:00",
          "finished_at": "2026-10-28T00:00:13.055002+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/real_estate_appraisers_20261028_000000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/real_estate_appraisers.py"
          ],
          "source_codes": [
            "real_estate_appraisers"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-28 00:00:12,953 INFO real_estate_appraisers DONE: parsed=3157 attempted=3157 matched=1769 outcomes={'exact1': 1573, 'sole_prop': 1255, 'multi_unresolved': 37, 'multi_resolved': 60, 'zero': 81, 'exact1_nopref': 100, 'multi_nopref': 15, 'exact1_closed': 36}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 177318,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最终汇总未给出新增／更新／写入操作计数；抓取量、解析量不能替代入库增量。"
        },
        {
          "task": "security_companies",
          "run_id": 30104,
          "started_at": "2026-10-27T23:30:00.303475+00:00",
          "finished_at": "2026-10-27T23:30:16.938964+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/security_companies_20261027_233000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/security_companies.py"
          ],
          "source_codes": [
            "security_companies"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-27 23:30:16,815 INFO security_companies DONE: prefs=2 fetched=165 matched=148 sole_prop=3",
          "summary_kind": "final_summary_line",
          "structured_job_id": 177313,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最终汇总未给出新增／更新／写入操作计数；抓取量、解析量不能替代入库增量。"
        },
        {
          "task": "travel_agencies",
          "run_id": 30096,
          "started_at": "2026-10-27T23:00:00.496812+00:00",
          "finished_at": "2026-10-27T23:00:01.827605+00:00",
          "status": "failed",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/travel_agencies_20261027_230000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/travel_agencies.py"
          ],
          "source_codes": [
            "travel_agencies"
          ],
          "is_latest_task_run": true,
          "current_task_status": "failed",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "jaha_animal_hospitals",
          "run_id": 29893,
          "started_at": "2026-10-26T22:30:02.180645+00:00",
          "finished_at": "2026-10-26T22:49:50.909616+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jaha_animal_hospitals_20261026_223000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jaha_animal_hospitals.py"
          ],
          "source_codes": [
            "jaha_animal_hospitals"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-26 22:49:50,789 INFO jaha_animal_hospitals done counts={'fetched': 681, 'parsed': 681, 'inserted': 681, 'errors': 0, 'skipped_non_hospital': 0} match_outcomes={'sole_prop_or_clinic': 680, 'zero': 1}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176911,
          "table": "business_licenses",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 681,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jcia_cosmetics",
          "run_id": 29886,
          "started_at": "2026-10-26T22:00:00.315081+00:00",
          "finished_at": "2026-10-26T22:00:01.596582+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jcia_cosmetics_20261026_220000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jcia_cosmetics.py"
          ],
          "source_codes": [
            "jcia_cosmetics"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-26 22:00:01,467 INFO jcia_cosmetics done counts={'fetched': 3, 'parsed': 0, 'inserted': 0, 'errors': 0} match_outcomes={}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176904,
          "table": "business_licenses",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "enecho_power_generators",
          "run_id": 29858,
          "started_at": "2026-10-26T20:10:00.186661+00:00",
          "finished_at": "2026-10-26T20:10:30.05369+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/enecho_power_generators_20261026_201000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/enecho_power_generators.py"
          ],
          "source_codes": [
            "enecho_power_generators"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 176867,
          "table": "business_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "care_facilities": {
      "latest_related_run": {
        "task": "kaigo_facilities",
        "run_id": 26356,
        "started_at": "2026-10-08T03:00:00.990137+00:00",
        "finished_at": "2026-10-08T03:09:01.735117+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kaigo_facilities_20261008_030000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/kaigo_facilities.py"
        ],
        "source_codes": [
          "kaigo_facilities"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 169820,
        "table": "care_facilities",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "kaigo_facilities",
          "run_id": 26356,
          "started_at": "2026-10-08T03:00:00.990137+00:00",
          "finished_at": "2026-10-08T03:09:01.735117+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kaigo_facilities_20261008_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kaigo_facilities.py"
          ],
          "source_codes": [
            "kaigo_facilities"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 169820,
          "table": "care_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "kaigo_facilities",
          "run_id": 20733,
          "started_at": "2026-09-08T03:00:00.209474+00:00",
          "finished_at": "2026-09-08T03:11:15.682591+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/kaigo_facilities.py"
          ],
          "source_codes": [
            "kaigo_facilities"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 158593,
          "table": "care_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "certifications": {
      "latest_related_run": {
        "task": "jclp",
        "run_id": 27098,
        "started_at": "2026-10-12T04:30:00.278756+00:00",
        "finished_at": "2026-10-12T04:30:25.8707+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jclp_20261012_043000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jclp.py"
        ],
        "source_codes": [
          "jclp"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-12 04:30:25,757 INFO jclp DONE: {'records_parsed': 245, 'deleted': 193, 'matched': 156, 'low_conf': 36, 'unmatched': 53, 'inserted': 192}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 171296,
        "table": "certifications",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 192,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "jclp",
        "run_id": 27098,
        "started_at": "2026-10-12T04:30:00.278756+00:00",
        "finished_at": "2026-10-12T04:30:25.8707+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jclp_20261012_043000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jclp.py"
        ],
        "source_codes": [
          "jclp"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-12 04:30:25,757 INFO jclp DONE: {'records_parsed': 245, 'deleted': 193, 'matched': 156, 'low_conf': 36, 'unmatched': 53, 'inserted': 192}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 171296,
        "table": "certifications",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 192,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "jclp",
          "run_id": 27098,
          "started_at": "2026-10-12T04:30:00.278756+00:00",
          "finished_at": "2026-10-12T04:30:25.8707+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jclp_20261012_043000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jclp.py"
          ],
          "source_codes": [
            "jclp"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-12 04:30:25,757 INFO jclp DONE: {'records_parsed': 245, 'deleted': 193, 'matched': 156, 'low_conf': 36, 'unmatched': 53, 'inserted': 192}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 171296,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 192,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "tcfd_supporters",
          "run_id": 27094,
          "started_at": "2026-10-12T04:00:00.466314+00:00",
          "finished_at": "2026-10-12T04:00:39.332406+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tcfd_supporters_20261012_040000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tcfd_supporters.py"
          ],
          "source_codes": [
            "tcfd_supporters"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-12 04:00:39,219 INFO tcfd_supporters DONE: {'records_parsed': 1512, 'parse_failed': 0, 'group_counts_expected': {'非金融': 1088, '金融': 231, 'その他機関': 151}, 'group_counts_parsed': {'非金融': 1114, '金融': 230, 'その他機関': 168}, 'deleted': 1512, 'matched_exact': 948, 'matched_fuzzy': 286, 'unmatched': 278, 'inserted': 1512}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 171291,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 1512,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "kenko_keiei",
          "run_id": 26907,
          "started_at": "2026-10-11T04:00:00.825179+00:00",
          "finished_at": "2026-10-11T04:09:53.193497+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kenko_keiei_20261011_040000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kenko_keiei.py"
          ],
          "source_codes": [
            "kenko_keiei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-11 04:09:53,053 INFO kenko_keiei DONE: {'xlsx_files': 2, 'records_parsed': 26838, 'deleted': 26822, 'inserted': 26822, 'no_match_corp': 16}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 170918,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 26822,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "run_id": 25921,
          "started_at": "2026-10-05T21:30:00.609759+00:00",
          "finished_at": "2026-10-05T22:27:42.923885+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/partnership_declaration_reps_ocr_20261005_213000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "certifications",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "youth_yell",
          "run_id": 25782,
          "started_at": "2026-10-05T03:00:01.026002+00:00",
          "finished_at": "2026-10-05T03:33:26.658743+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/youth_yell_20261005_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/youth_yell.py"
          ],
          "source_codes": [
            "youth_yell"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-05 03:33:25,695 INFO youth_yell DONE: {'list_companies': 2159, 'detail_fetched': 2158, 'inserted': 2158, 'matched': 1832, 'no_match': 326, 'parse_failed': 1}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 168691,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 2158,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "sbt_certified",
          "run_id": 25779,
          "started_at": "2026-10-05T03:00:01.022964+00:00",
          "finished_at": "2026-10-05T03:02:56.638045+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/sbt_certified_20261005_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/sbt_certified.py"
          ],
          "source_codes": [
            "sbt_certified"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-05 03:02:50,341 INFO sbt_certified DONE: {'jp_companies': 2660, 'jp_target_rows': 3818, 'records_built': 2976, 'deleted': 2970, 'inserted': 2976, 'matched_corp': 0, 'unmatched_corp': 2976, 'skipped_no_date': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 168692,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 2976,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "eco_action21",
          "run_id": 25716,
          "started_at": "2026-10-04T21:00:00.418477+00:00",
          "finished_at": "2026-10-04T21:06:34.632245+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/eco_action21_20261004_210000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/eco_action21.py"
          ],
          "source_codes": [
            "eco_action21"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-04 21:06:34,514 INFO eco_action21 DONE: {'pdfs_fetched': 2, 'rows_parsed': 177, 'rows_lastmonth': 18, 'rows_recyc': 159, 'inserted': 169, 'deleted': 170, 'no_match_corp': 8, 'skipped': 0, 'errors': []}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 168623,
          "table": "certifications",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 169,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "partnership_declaration_reps",
          "run_id": 25711,
          "started_at": "2026-10-04T20:30:00.393266+00:00",
          "finished_at": "2026-10-04T20:30:55.738629+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/partnership_declaration_reps_20261004_203000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "certifications",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "companies": {
      "latest_related_run": {
        "task": "company_geocode",
        "run_id": 31166,
        "started_at": "2026-11-02T10:45:00.5816+00:00",
        "finished_at": "2026-11-02T10:45:24.781575+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/geocode_companies_parallel.py"
        ],
        "source_codes": [
          "company_geocode"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179491,
        "table": "companies",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": {
        "task": "gbizinfo_html",
        "run_id": 31153,
        "started_at": "2026-11-02T09:00:03.601692+00:00",
        "finished_at": "2026-11-02T09:13:37.022838+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/gbizinfo_html_20261102_090000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/run_gbizinfo_html_batch.py"
        ],
        "source_codes": [
          "gbizinfo_html"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 09:13:36,912 INFO gbizinfo_html_batch DONE  fetched=0  found=0  with_url=0  updated=0  errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "companies",
        "attribution": "reviewed_counter_scope",
        "counters": {
          "inserted": null,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "updated": "updated"
          },
          "notes": [
            "批处理最终汇总的 updated 对应 companies 官网字段更新。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "批处理最终汇总的 updated 对应 companies 官网字段更新。"
      },
      "other_runs": [
        {
          "task": "company_geocode",
          "run_id": 31166,
          "started_at": "2026-11-02T10:45:00.5816+00:00",
          "finished_at": "2026-11-02T10:45:24.781575+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179491,
          "table": "companies",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "nta_houjin_daily",
          "run_id": 31161,
          "started_at": "2026-11-02T10:00:00.271629+00:00",
          "finished_at": "2026-11-02T10:00:00.911619+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nta_houjin_daily_20261102_100000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"mode\": \"daily\", \"dates_processed\": 0, \"rows_read\": 0, \"rows_inserted\": 0, \"rows_updated\": 0}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "companies",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "company_geocode",
          "run_id": 31159,
          "started_at": "2026-11-02T09:45:00.671895+00:00",
          "finished_at": "2026-11-02T09:45:24.541707+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179424,
          "table": "companies",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "gbizinfo_html",
          "run_id": 31153,
          "started_at": "2026-11-02T09:00:03.601692+00:00",
          "finished_at": "2026-11-02T09:13:37.022838+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/gbizinfo_html_20261102_090000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/run_gbizinfo_html_batch.py"
          ],
          "source_codes": [
            "gbizinfo_html"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 09:13:36,912 INFO gbizinfo_html_batch DONE  fetched=0  found=0  with_url=0  updated=0  errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "companies",
          "attribution": "reviewed_counter_scope",
          "counters": {
            "inserted": null,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "updated": "updated"
            },
            "notes": [
              "批处理最终汇总的 updated 对应 companies 官网字段更新。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "批处理最终汇总的 updated 对应 companies 官网字段更新。"
        },
        {
          "table": "companies",
          "task": "tyc-establishment-edinet.timer",
          "run_id": null,
          "started_at": null,
          "finished_at": "2026-11-02T04:30:14.157722+00:00",
          "status": "log_only",
          "log_path": "/var/log/tyc/establishment-edinet.err.log",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/backfill_establishment_from_edinet.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "unverified",
          "summary_line": "2026-11-02 04:30:05,539 INFO backfill_estab_edinet DONE: {'candidates': 0, 'fetched': 0, 'no_zip': 0, 'no_textblock': 0, 'no_match': 0, 'extracted': 0, 'written': 0, 'skipped_priority': 0, 'skipped_already_edinet': 4736, 'http_error': 0, 'parse_error': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "attribution": "unattributed",
          "counters": null,
          "reason": "独立服务日志未对齐到可确认的单次任务边界／成功状态，暂不输出表级增量。"
        },
        {
          "task": "gbizinfo_html",
          "run_id": 31113,
          "started_at": "2026-11-02T03:00:00.539953+00:00",
          "finished_at": "2026-11-02T03:01:29.348107+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/run_gbizinfo_html_batch.py"
          ],
          "source_codes": [
            "gbizinfo_html"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-02 03:01:29,272 INFO gbizinfo_html_batch DONE  fetched=0  found=0  with_url=0  updated=0  errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179252,
          "table": "companies",
          "attribution": "reviewed_counter_scope",
          "counters": {
            "inserted": null,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "updated": "updated"
            },
            "notes": [
              "批处理最终汇总的 updated 对应 companies 官网字段更新。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "批处理最终汇总的 updated 对应 companies 官网字段更新。"
        },
        {
          "task": "risk_score_derived",
          "run_id": 31025,
          "started_at": "2026-11-01T19:00:00.288004+00:00",
          "finished_at": "2026-11-01T19:01:19.277452+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/risk_score_derived_20261101_190000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/derive_risk_score.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "companies",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "table": "companies",
          "task": "tyc-nta-daily.timer",
          "run_id": null,
          "started_at": null,
          "finished_at": "2026-11-01T18:36:54.104268+00:00",
          "status": "log_only",
          "log_path": "/var/log/tyc/nta-daily.err.log",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_houjin_via_api.py"
          ],
          "source_codes": [
            "nta_houjin_api_v1"
          ],
          "is_latest_task_run": true,
          "current_task_status": "unverified",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "attribution": "unattributed",
          "counters": null,
          "reason": "独立服务日志未对齐到可确认的单次任务边界／成功状态，暂不输出表级增量。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "companies_virtual_office_match": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_address_aza_matches": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_aliases": {
      "latest_related_run": {
        "task": "nta_houjin_daily",
        "run_id": 31161,
        "started_at": "2026-11-02T10:00:00.271629+00:00",
        "finished_at": "2026-11-02T10:00:00.911619+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nta_houjin_daily_20261102_100000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/import_houjin_bangou.py"
        ],
        "source_codes": [
          "nta_houjin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\"mode\": \"daily\", \"dates_processed\": 0, \"rows_read\": 0, \"rows_inserted\": 0, \"rows_updated\": 0}",
        "summary_kind": "stdout_json",
        "structured_job_id": null,
        "table": "company_aliases",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "nta_houjin_daily",
          "run_id": 31161,
          "started_at": "2026-11-02T10:00:00.271629+00:00",
          "finished_at": "2026-11-02T10:00:00.911619+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nta_houjin_daily_20261102_100000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"mode\": \"daily\", \"dates_processed\": 0, \"rows_read\": 0, \"rows_inserted\": 0, \"rows_updated\": 0}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "table": "company_aliases",
          "task": "tyc-nta-daily.timer",
          "run_id": null,
          "started_at": null,
          "finished_at": "2026-11-01T18:36:54.104268+00:00",
          "status": "log_only",
          "log_path": "/var/log/tyc/nta-daily.err.log",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_houjin_via_api.py"
          ],
          "source_codes": [
            "nta_houjin_api_v1"
          ],
          "is_latest_task_run": true,
          "current_task_status": "unverified",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "attribution": "unattributed",
          "counters": null,
          "reason": "独立服务日志未对齐到可确认的单次任务边界／成功状态，暂不输出表级增量。"
        },
        {
          "task": "nta_houjin_daily",
          "run_id": 30957,
          "started_at": "2026-11-01T10:00:00.561597+00:00",
          "finished_at": "2026-11-01T10:00:01.176977+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\"mode\": \"daily\", \"dates_processed\": 0, \"rows_read\": 0, \"rows_inserted\": 0, \"rows_updated\": 0}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "jpx_listed",
          "run_id": 29903,
          "started_at": "2026-10-26T23:00:00.234429+00:00",
          "finished_at": "2026-10-26T23:00:01.051055+00:00",
          "status": "failed",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jpx_listed_20261026_230000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jpx_listed.py"
          ],
          "source_codes": [
            "jpx_listed"
          ],
          "is_latest_task_run": true,
          "current_task_status": "failed",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "jpx_listed",
          "run_id": 28561,
          "started_at": "2026-10-19T23:00:01.946459+00:00",
          "finished_at": "2026-10-19T23:00:02.94226+00:00",
          "status": "failed",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/jpx_listed.py"
          ],
          "source_codes": [
            "jpx_listed"
          ],
          "is_latest_task_run": false,
          "current_task_status": "failed",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "nta_houjin_monthly",
          "run_id": 25820,
          "started_at": "2026-10-05T09:00:00.471719+00:00",
          "finished_at": "2026-10-05T15:00:05.611716+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nta_houjin_monthly_20261005_090000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "nta_houjin_monthly",
          "run_id": 20147,
          "started_at": "2026-09-05T09:00:00.210081+00:00",
          "finished_at": "2026-09-05T12:20:29.80914+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": "{\"mode\": \"monthly\", \"rows_read\": 5827771, \"rows_inserted\": 0, \"rows_updated\": 5827771}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "company_aliases",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_associations": {
      "latest_related_run": {
        "task": "keidanren_members",
        "run_id": 25579,
        "started_at": "2026-10-04T02:00:00.261701+00:00",
        "finished_at": "2026-10-04T02:06:23.407804+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/keidanren_members_20261004_020000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/keidanren_members.py"
        ],
        "source_codes": [
          "keidanren_members"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-04 02:06:23,244 INFO keidanren_members DONE: {'pdfs_processed': 3, 'records_parsed': 1784, 'deleted': 1784, 'inserted': 1784, 'matched_exact': 1192, 'matched_alias': 0, 'matched_fuzzy': 71, 'unmatched': 521}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 168305,
        "table": "company_associations",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 1784,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "keidanren_members",
        "run_id": 25579,
        "started_at": "2026-10-04T02:00:00.261701+00:00",
        "finished_at": "2026-10-04T02:06:23.407804+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/keidanren_members_20261004_020000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/keidanren_members.py"
        ],
        "source_codes": [
          "keidanren_members"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-04 02:06:23,244 INFO keidanren_members DONE: {'pdfs_processed': 3, 'records_parsed': 1784, 'deleted': 1784, 'inserted': 1784, 'matched_exact': 1192, 'matched_alias': 0, 'matched_fuzzy': 71, 'unmatched': 521}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 168305,
        "table": "company_associations",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 1784,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "keidanren_members",
          "run_id": 25579,
          "started_at": "2026-10-04T02:00:00.261701+00:00",
          "finished_at": "2026-10-04T02:06:23.407804+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/keidanren_members_20261004_020000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/keidanren_members.py"
          ],
          "source_codes": [
            "keidanren_members"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-04 02:06:23,244 INFO keidanren_members DONE: {'pdfs_processed': 3, 'records_parsed': 1784, 'deleted': 1784, 'inserted': 1784, 'matched_exact': 1192, 'matched_alias': 0, 'matched_fuzzy': 71, 'unmatched': 521}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 168305,
          "table": "company_associations",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 1784,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "keidanren_members",
          "run_id": 19901,
          "started_at": "2026-09-04T02:00:00.183464+00:00",
          "finished_at": "2026-09-04T02:03:49.938871+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/keidanren_members.py"
          ],
          "source_codes": [
            "keidanren_members"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-04 02:03:49,789 INFO keidanren_members DONE: {'pdfs_processed': 3, 'records_parsed': 1784, 'deleted': 1784, 'inserted': 1784, 'matched_exact': 1194, 'matched_alias': 0, 'matched_fuzzy': 69, 'unmatched': 521}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 157016,
          "table": "company_associations",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 1784,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_business_model": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_business_purpose": {
      "latest_related_run": {
        "task": "edinet_business_purpose",
        "run_id": 31080,
        "started_at": "2026-11-01T23:20:00.090972+00:00",
        "finished_at": "2026-11-01T23:24:34.080469+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_business_purpose_20261101_232000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_business_purpose.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 23:24:34,009 INFO edinet_business_purpose DONE shard 0/1: queried=231 new=0 upd=0 skip=231 err=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179219,
        "table": "company_business_purpose",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "edinet_business_purpose",
        "run_id": 31080,
        "started_at": "2026-11-01T23:20:00.090972+00:00",
        "finished_at": "2026-11-01T23:24:34.080469+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_business_purpose_20261101_232000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_business_purpose.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 23:24:34,009 INFO edinet_business_purpose DONE shard 0/1: queried=231 new=0 upd=0 skip=231 err=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179219,
        "table": "company_business_purpose",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "edinet_business_purpose",
          "run_id": 31080,
          "started_at": "2026-11-01T23:20:00.090972+00:00",
          "finished_at": "2026-11-01T23:24:34.080469+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_business_purpose_20261101_232000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_business_purpose.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:24:34,009 INFO edinet_business_purpose DONE shard 0/1: queried=231 new=0 upd=0 skip=231 err=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179219,
          "table": "company_business_purpose",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_business_purpose",
          "run_id": 30876,
          "started_at": "2026-10-31T23:20:00.221751+00:00",
          "finished_at": "2026-10-31T23:24:18.170476+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_business_purpose.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 23:24:18,099 INFO edinet_business_purpose DONE shard 0/1: queried=231 new=0 upd=0 skip=231 err=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "company_business_purpose",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_business_scope": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_changes": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_co_major_shareholder": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_contract_profile": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_family_control": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_financial_quality": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_foreign_capital": {
      "latest_related_run": {
        "task": "edinet_foreign_capital_derived",
        "run_id": 30903,
        "started_at": "2026-11-01T02:30:00.159578+00:00",
        "finished_at": "2026-11-01T02:30:03.553256+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_foreign_capital_derived_20261101_023000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/derive_foreign_capital.py"
        ],
        "source_codes": [
          "edinet_foreign_capital_derived"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "company_foreign_capital",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "edinet_foreign_capital_derived",
          "run_id": 30903,
          "started_at": "2026-11-01T02:30:00.159578+00:00",
          "finished_at": "2026-11-01T02:30:03.553256+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_foreign_capital_derived_20261101_023000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/derive_foreign_capital.py"
          ],
          "source_codes": [
            "edinet_foreign_capital_derived"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_foreign_capital",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "edinet_foreign_capital_derived",
          "run_id": 25042,
          "started_at": "2026-10-01T02:30:00.357323+00:00",
          "finished_at": "2026-10-01T02:30:07.697679+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/derive_foreign_capital.py"
          ],
          "source_codes": [
            "edinet_foreign_capital_derived"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_foreign_capital",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_geo_density_grid": {
      "latest_related_run": {
        "task": "company_location_profile",
        "run_id": 31167,
        "started_at": "2026-11-02T10:55:00.591595+00:00",
        "finished_at": null,
        "status": "running",
        "log_path": "scheduler_runs stdout_tail/stderr_tail",
        "log_file_matched": false,
        "programs": [
          "backend/scripts/derive_company_location_profiles.py"
        ],
        "source_codes": [
          "company_location_profile"
        ],
        "is_latest_task_run": true,
        "current_task_status": "running",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "company_geo_density_grid",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "company_location_profile",
          "run_id": 31167,
          "started_at": "2026-11-02T10:55:00.591595+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_geo_density_grid",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "company_location_profile",
          "run_id": 31160,
          "started_at": "2026-11-02T09:55:00.591774+00:00",
          "finished_at": "2026-11-02T10:28:35.500885+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_location_profile_20261102_095500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": false,
          "current_task_status": "running",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"processed\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179475,
          "table": "company_geo_density_grid",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_geocode_attempts": {
      "latest_related_run": {
        "task": "company_geocode",
        "run_id": 31166,
        "started_at": "2026-11-02T10:45:00.5816+00:00",
        "finished_at": "2026-11-02T10:45:24.781575+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/geocode_companies_parallel.py"
        ],
        "source_codes": [
          "company_geocode"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179491,
        "table": "company_geocode_attempts",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "company_geocode",
          "run_id": 31166,
          "started_at": "2026-11-02T10:45:00.5816+00:00",
          "finished_at": "2026-11-02T10:45:24.781575+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179491,
          "table": "company_geocode_attempts",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "company_geocode",
          "run_id": 31159,
          "started_at": "2026-11-02T09:45:00.671895+00:00",
          "finished_at": "2026-11-02T09:45:24.541707+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179424,
          "table": "company_geocode_attempts",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_geocodes": {
      "latest_related_run": {
        "task": "company_geocode",
        "run_id": 31166,
        "started_at": "2026-11-02T10:45:00.5816+00:00",
        "finished_at": "2026-11-02T10:45:24.781575+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/geocode_companies_parallel.py"
        ],
        "source_codes": [
          "company_geocode"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179491,
        "table": "company_geocodes",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "company_geocode",
          "run_id": 31166,
          "started_at": "2026-11-02T10:45:00.5816+00:00",
          "finished_at": "2026-11-02T10:45:24.781575+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179491,
          "table": "company_geocodes",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "company_geocode",
          "run_id": 31159,
          "started_at": "2026-11-02T09:45:00.671895+00:00",
          "finished_at": "2026-11-02T09:45:24.541707+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179424,
          "table": "company_geocodes",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_industry_inferred": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_industry_rank": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_interlocks": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_intl_profile": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_ip_profile": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_key_persons": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_location_profiles": {
      "latest_related_run": {
        "task": "company_location_profile",
        "run_id": 31167,
        "started_at": "2026-11-02T10:55:00.591595+00:00",
        "finished_at": null,
        "status": "running",
        "log_path": "scheduler_runs stdout_tail/stderr_tail",
        "log_file_matched": false,
        "programs": [
          "backend/scripts/derive_company_location_profiles.py"
        ],
        "source_codes": [
          "company_location_profile"
        ],
        "is_latest_task_run": true,
        "current_task_status": "running",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "company_location_profiles",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": {
        "task": "company_location_profile",
        "run_id": 31160,
        "started_at": "2026-11-02T09:55:00.591774+00:00",
        "finished_at": "2026-11-02T10:28:35.500885+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_location_profile_20261102_095500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/derive_company_location_profiles.py"
        ],
        "source_codes": [
          "company_location_profile"
        ],
        "is_latest_task_run": false,
        "current_task_status": "running",
        "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"processed\": 0, \"written\": 0, \"errors\": 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179475,
        "table": "company_location_profiles",
        "attribution": "reviewed_counter_scope",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 0,
          "metric_keys": {
            "write_operations": "written"
          },
          "notes": [
            "written 是画像 upsert 操作数，无法区分新增与更新；不归给密度网格表。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "written 是画像 upsert 操作数，无法区分新增与更新；不归给密度网格表。"
      },
      "other_runs": [
        {
          "task": "company_location_profile",
          "run_id": 31167,
          "started_at": "2026-11-02T10:55:00.591595+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_location_profiles",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "company_location_profile",
          "run_id": 31160,
          "started_at": "2026-11-02T09:55:00.591774+00:00",
          "finished_at": "2026-11-02T10:28:35.500885+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_location_profile_20261102_095500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": false,
          "current_task_status": "running",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"processed\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179475,
          "table": "company_location_profiles",
          "attribution": "reviewed_counter_scope",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "write_operations": "written"
            },
            "notes": [
              "written 是画像 upsert 操作数，无法区分新增与更新；不归给密度网格表。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "written 是画像 upsert 操作数，无法区分新增与更新；不归给密度网格表。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_management_stability": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_paper_co_flag": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_pep_profile": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_professional_staff": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_profile_card": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_registered_profiles": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_relationships": {
      "latest_related_run": {
        "task": "parse_change_cause",
        "run_id": 30964,
        "started_at": "2026-11-01T11:00:00.611594+00:00",
        "finished_at": "2026-11-01T11:00:23.981654+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/parse_change_cause_20261101_110000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_change_cause.py"
        ],
        "source_codes": [],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "company_relationships",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": {
        "task": "edinet_subsidiaries",
        "run_id": 30892,
        "started_at": "2026-11-01T01:00:00.176345+00:00",
        "finished_at": "2026-11-01T01:16:38.575+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_subsidiaries_20261101_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/fetch_edinet_subsidiaries.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 01:16:38,509 INFO DONE: {'processed': 1106, 'fetched': 1106, 'with_rels': 49, 'rows_written': 319, 'rows_resolved': 88, 'fail': 0, 'start': 1793494800.341792}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "company_relationships",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 319,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "rows_written"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "parse_change_cause",
          "run_id": 30964,
          "started_at": "2026-11-01T11:00:00.611594+00:00",
          "finished_at": "2026-11-01T11:00:23.981654+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/parse_change_cause_20261101_110000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_change_cause.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_relationships",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "edinet_subsidiaries",
          "run_id": 30892,
          "started_at": "2026-11-01T01:00:00.176345+00:00",
          "finished_at": "2026-11-01T01:16:38.575+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_subsidiaries_20261101_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/fetch_edinet_subsidiaries.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 01:16:38,509 INFO DONE: {'processed': 1106, 'fetched': 1106, 'with_rels': 49, 'rows_written': 319, 'rows_resolved': 88, 'fail': 0, 'start': 1793494800.341792}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "company_relationships",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 319,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "rows_written"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "parse_change_cause",
          "run_id": 30761,
          "started_at": "2026-10-31T11:00:00.55159+00:00",
          "finished_at": "2026-10-31T11:00:24.131618+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_change_cause.py"
          ],
          "source_codes": [],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_relationships",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "edinet_subsidiaries",
          "run_id": 25030,
          "started_at": "2026-10-01T01:00:00.307578+00:00",
          "finished_at": "2026-10-01T07:00:05.375404+00:00",
          "status": "timeout",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/fetch_edinet_subsidiaries.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_relationships",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_risk_dashboard": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_same_address": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_subpage_data": {
      "latest_related_run": {
        "task": "phase4_subpages",
        "run_id": 31010,
        "started_at": "2026-11-01T17:30:00.163391+00:00",
        "finished_at": "2026-11-01T18:16:30.239274+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/phase4_subpages_20261101_173000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/run_phase4_v3_subpages.py"
        ],
        "source_codes": [
          "company_website_data"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 18:16:29,781 INFO DONE: {'processed': 31730, 'home_fetched': 31348, 'home_failed': 382, 'subpages_found': 31722, 'subpages_fetched': 545, 'subpages_saved': 523, 'sub_timeouts': 3, 'sub_non_200': 20, 'sub_errors': 0, 'db_errors': 2, 'start': 1793554200.3157005}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "company_subpage_data",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 523,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "subpages_saved"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "phase4_subpages",
        "run_id": 31010,
        "started_at": "2026-11-01T17:30:00.163391+00:00",
        "finished_at": "2026-11-01T18:16:30.239274+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/phase4_subpages_20261101_173000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/run_phase4_v3_subpages.py"
        ],
        "source_codes": [
          "company_website_data"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 18:16:29,781 INFO DONE: {'processed': 31730, 'home_fetched': 31348, 'home_failed': 382, 'subpages_found': 31722, 'subpages_fetched': 545, 'subpages_saved': 523, 'sub_timeouts': 3, 'sub_non_200': 20, 'sub_errors': 0, 'db_errors': 2, 'start': 1793554200.3157005}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "company_subpage_data",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 523,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "subpages_saved"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "phase4_subpages",
          "run_id": 31010,
          "started_at": "2026-11-01T17:30:00.163391+00:00",
          "finished_at": "2026-11-01T18:16:30.239274+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/phase4_subpages_20261101_173000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/run_phase4_v3_subpages.py"
          ],
          "source_codes": [
            "company_website_data"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 18:16:29,781 INFO DONE: {'processed': 31730, 'home_fetched': 31348, 'home_failed': 382, 'subpages_found': 31722, 'subpages_fetched': 545, 'subpages_saved': 523, 'sub_timeouts': 3, 'sub_non_200': 20, 'sub_errors': 0, 'db_errors': 2, 'start': 1793554200.3157005}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "company_subpage_data",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 523,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "subpages_saved"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "phase4_subpages",
          "run_id": 30806,
          "started_at": "2026-10-31T17:30:00.228116+00:00",
          "finished_at": "2026-10-31T18:15:44.432078+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/run_phase4_v3_subpages.py"
          ],
          "source_codes": [
            "company_website_data"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 18:15:44,076 INFO DONE: {'processed': 31215, 'home_fetched': 30864, 'home_failed': 351, 'subpages_found': 31703, 'subpages_fetched': 579, 'subpages_saved': 564, 'sub_timeouts': 4, 'sub_non_200': 15, 'sub_errors': 0, 'db_errors': 0, 'start': 1793467800.3813899}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "company_subpage_data",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 564,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "subpages_saved"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_subsidiary_closure": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_ubo": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_vitality_score": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_website_data": {
      "latest_related_run": {
        "task": "phase4_homepage",
        "run_id": 31005,
        "started_at": "2026-11-01T17:00:00.304238+00:00",
        "finished_at": "2026-11-01T17:00:09.160449+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/phase4_homepage_20261101_170000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/run_phase4_website_scraper.py"
        ],
        "source_codes": [
          "company_website_data"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "company_website_data",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "phase4_homepage",
          "run_id": 31005,
          "started_at": "2026-11-01T17:00:00.304238+00:00",
          "finished_at": "2026-11-01T17:00:09.160449+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/phase4_homepage_20261101_170000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/run_phase4_website_scraper.py"
          ],
          "source_codes": [
            "company_website_data"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_website_data",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "phase4_homepage",
          "run_id": 30801,
          "started_at": "2026-10-31T17:00:00.392191+00:00",
          "finished_at": "2026-10-31T17:00:25.751037+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/run_phase4_website_scraper.py"
          ],
          "source_codes": [
            "company_website_data"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "company_website_data",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "company_wikidata": {
      "latest_related_run": {
        "task": "wikidata_houjin",
        "run_id": 31098,
        "started_at": "2026-11-02T01:00:00.201538+00:00",
        "finished_at": "2026-11-02T01:51:14.472606+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/wikidata_houjin_20261102_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/wikidata_houjin.py"
        ],
        "source_codes": [
          "wikidata_houjin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 01:51:14,320 INFO wikidata_houjin DONE: {'sparql_rows': 9767, 'matched_companies': 9767, 'wp_summaries_fetched': 5540, 'wp_summaries_missing': 3, 'upserts': 9767, 'errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179237,
        "table": "company_wikidata",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 9767,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "upserts"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "wikidata_houjin",
        "run_id": 31098,
        "started_at": "2026-11-02T01:00:00.201538+00:00",
        "finished_at": "2026-11-02T01:51:14.472606+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/wikidata_houjin_20261102_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/wikidata_houjin.py"
        ],
        "source_codes": [
          "wikidata_houjin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 01:51:14,320 INFO wikidata_houjin DONE: {'sparql_rows': 9767, 'matched_companies': 9767, 'wp_summaries_fetched': 5540, 'wp_summaries_missing': 3, 'upserts': 9767, 'errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179237,
        "table": "company_wikidata",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 9767,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "upserts"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "wikidata_houjin",
          "run_id": 31098,
          "started_at": "2026-11-02T01:00:00.201538+00:00",
          "finished_at": "2026-11-02T01:51:14.472606+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/wikidata_houjin_20261102_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/wikidata_houjin.py"
          ],
          "source_codes": [
            "wikidata_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 01:51:14,320 INFO wikidata_houjin DONE: {'sparql_rows': 9767, 'matched_companies': 9767, 'wp_summaries_fetched': 5540, 'wp_summaries_missing': 3, 'upserts': 9767, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179237,
          "table": "company_wikidata",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 9767,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "upserts"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "wikidata_houjin",
          "run_id": 30891,
          "started_at": "2026-11-01T01:00:00.213981+00:00",
          "finished_at": "2026-11-01T01:51:39.627849+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/wikidata_houjin.py"
          ],
          "source_codes": [
            "wikidata_houjin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-01 01:51:39,485 INFO wikidata_houjin DONE: {'sparql_rows': 9777, 'matched_companies': 9776, 'wp_summaries_fetched': 5512, 'wp_summaries_missing': 2, 'upserts': 9776, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178846,
          "table": "company_wikidata",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 9776,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "upserts"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "compliance_check_batches": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "compliance_check_decisions": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "compliance_check_evidence": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "compliance_check_targets": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "construction_licenses": {
      "latest_related_run": {
        "task": "construction_licenses",
        "run_id": 25781,
        "started_at": "2026-10-05T03:00:01.030366+00:00",
        "finished_at": "2026-10-05T07:00:06.428752+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/construction_licenses_20261005_030000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/construction_licenses.py"
        ],
        "source_codes": [
          "construction_licenses"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "construction_licenses",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "construction_licenses",
          "run_id": 25781,
          "started_at": "2026-10-05T03:00:01.030366+00:00",
          "finished_at": "2026-10-05T07:00:06.428752+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/construction_licenses_20261005_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/construction_licenses.py"
          ],
          "source_codes": [
            "construction_licenses"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "construction_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "construction_licenses",
          "run_id": 20110,
          "started_at": "2026-09-05T03:00:00.233131+00:00",
          "finished_at": "2026-09-05T07:00:05.547025+00:00",
          "status": "timeout",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/construction_licenses.py"
          ],
          "source_codes": [
            "construction_licenses"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "construction_licenses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "corp_keiretsu_cluster": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "court_case_company_links": {
      "latest_related_run": {
        "task": "courts_hanrei_pdf_parse",
        "run_id": 31042,
        "started_at": "2026-11-01T20:35:00.09748+00:00",
        "finished_at": "2026-11-01T20:35:01.389301+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_courts_hanrei_pdfs.py"
        ],
        "source_codes": [
          "courts_hanrei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179177,
        "table": "court_case_company_links",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 31042,
          "started_at": "2026-11-01T20:35:00.09748+00:00",
          "finished_at": "2026-11-01T20:35:01.389301+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179177,
          "table": "court_case_company_links",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 30839,
          "started_at": "2026-10-31T20:35:00.092203+00:00",
          "finished_at": "2026-10-31T20:35:00.862237+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:35:00,782 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178790,
          "table": "court_case_company_links",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "court_case_facts": {
      "latest_related_run": {
        "task": "courts_hanrei_pdf_parse",
        "run_id": 31042,
        "started_at": "2026-11-01T20:35:00.09748+00:00",
        "finished_at": "2026-11-01T20:35:01.389301+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_courts_hanrei_pdfs.py"
        ],
        "source_codes": [
          "courts_hanrei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179177,
        "table": "court_case_facts",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 31042,
          "started_at": "2026-11-01T20:35:00.09748+00:00",
          "finished_at": "2026-11-01T20:35:01.389301+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179177,
          "table": "court_case_facts",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 30839,
          "started_at": "2026-10-31T20:35:00.092203+00:00",
          "finished_at": "2026-10-31T20:35:00.862237+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:35:00,782 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178790,
          "table": "court_case_facts",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "court_case_judges": {
      "latest_related_run": {
        "task": "courts_hanrei_pdf_parse",
        "run_id": 31042,
        "started_at": "2026-11-01T20:35:00.09748+00:00",
        "finished_at": "2026-11-01T20:35:01.389301+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_courts_hanrei_pdfs.py"
        ],
        "source_codes": [
          "courts_hanrei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179177,
        "table": "court_case_judges",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 31042,
          "started_at": "2026-11-01T20:35:00.09748+00:00",
          "finished_at": "2026-11-01T20:35:01.389301+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179177,
          "table": "court_case_judges",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 30839,
          "started_at": "2026-10-31T20:35:00.092203+00:00",
          "finished_at": "2026-10-31T20:35:00.862237+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:35:00,782 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178790,
          "table": "court_case_judges",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "court_hanrei_pdf_parses": {
      "latest_related_run": {
        "task": "courts_hanrei_pdf_parse",
        "run_id": 31042,
        "started_at": "2026-11-01T20:35:00.09748+00:00",
        "finished_at": "2026-11-01T20:35:01.389301+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_courts_hanrei_pdfs.py"
        ],
        "source_codes": [
          "courts_hanrei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179177,
        "table": "court_hanrei_pdf_parses",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 31042,
          "started_at": "2026-11-01T20:35:00.09748+00:00",
          "finished_at": "2026-11-01T20:35:01.389301+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179177,
          "table": "court_hanrei_pdf_parses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 30839,
          "started_at": "2026-10-31T20:35:00.092203+00:00",
          "finished_at": "2026-10-31T20:35:00.862237+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:35:00,782 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178790,
          "table": "court_hanrei_pdf_parses",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "crawl_jobs": {
      "latest_related_run": {
        "task": "company_location_profile",
        "run_id": 31167,
        "started_at": "2026-11-02T10:55:00.591595+00:00",
        "finished_at": null,
        "status": "running",
        "log_path": "scheduler_runs stdout_tail/stderr_tail",
        "log_file_matched": false,
        "programs": [
          "backend/scripts/derive_company_location_profiles.py"
        ],
        "source_codes": [
          "company_location_profile"
        ],
        "is_latest_task_run": true,
        "current_task_status": "running",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "crawl_jobs",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "company_location_profile",
          "run_id": 31167,
          "started_at": "2026-11-02T10:55:00.591595+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "company_geocode",
          "run_id": 31166,
          "started_at": "2026-11-02T10:45:00.5816+00:00",
          "finished_at": "2026-11-02T10:45:24.781575+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_geocode_20261102_104500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/geocode_companies_parallel.py"
          ],
          "source_codes": [
            "company_geocode"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"cache_hits\": 0, \"provider_hits\": 0, \"misses\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179491,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tdnet",
          "run_id": 31165,
          "started_at": "2026-11-02T10:35:15.861583+00:00",
          "finished_at": "2026-11-02T10:37:01.501592+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179490,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "company_location_profile",
          "run_id": 31160,
          "started_at": "2026-11-02T09:55:00.591774+00:00",
          "finished_at": "2026-11-02T10:28:35.500885+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/company_location_profile_20261102_095500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/derive_company_location_profiles.py"
          ],
          "source_codes": [
            "company_location_profile"
          ],
          "is_latest_task_run": false,
          "current_task_status": "running",
          "summary_line": "{\"event\": \"done\", \"batches\": 0, \"candidates\": 0, \"processed\": 0, \"written\": 0, \"errors\": 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179475,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31164,
          "started_at": "2026-11-02T10:20:11.121992+00:00",
          "finished_at": "2026-11-02T10:20:18.237151+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179489,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "jgrants",
          "run_id": 31149,
          "started_at": "2026-11-02T08:30:01.1036+00:00",
          "finished_at": "2026-11-02T10:17:45.162049+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgrants_20261102_083000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jgrants.py"
          ],
          "source_codes": [
            "jgrants"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:17:45,021 INFO jgrants DONE: fetched=3948 new=3 updated=3945 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179288,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "prtimes",
          "run_id": 31163,
          "started_at": "2026-11-02T10:15:06.567548+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/prtimes.py"
          ],
          "source_codes": [
            "prtimes"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "tdnet",
          "run_id": 31162,
          "started_at": "2026-11-02T10:05:07.461588+00:00",
          "finished_at": "2026-11-02T10:06:56.18162+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 1, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179487,
          "table": "crawl_jobs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "crawl_jobs_2026_05": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "crawl_jobs_2026_06": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "crawl_jobs_default": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "cross_listings": {
      "latest_related_run": {
        "task": "sec_20f",
        "run_id": 29868,
        "started_at": "2026-10-26T21:00:00.353885+00:00",
        "finished_at": "2026-10-26T21:00:01.393983+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/sec_20f_20261026_210000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/sec_20f.py"
        ],
        "source_codes": [
          "sec_20f"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-26 21:00:01,312 INFO sec_20f DONE sec_20f: fetched=0 new=0 updated=0 matched=0 unmatched=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 176875,
        "table": "cross_listings",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "sec_20f",
        "run_id": 29868,
        "started_at": "2026-10-26T21:00:00.353885+00:00",
        "finished_at": "2026-10-26T21:00:01.393983+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/sec_20f_20261026_210000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/sec_20f.py"
        ],
        "source_codes": [
          "sec_20f"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-26 21:00:01,312 INFO sec_20f DONE sec_20f: fetched=0 new=0 updated=0 matched=0 unmatched=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 176875,
        "table": "cross_listings",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "sec_20f",
          "run_id": 29868,
          "started_at": "2026-10-26T21:00:00.353885+00:00",
          "finished_at": "2026-10-26T21:00:01.393983+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/sec_20f_20261026_210000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/sec_20f.py"
          ],
          "source_codes": [
            "sec_20f"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-26 21:00:01,312 INFO sec_20f DONE sec_20f: fetched=0 new=0 updated=0 matched=0 unmatched=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176875,
          "table": "cross_listings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "sec_20f",
          "run_id": 28526,
          "started_at": "2026-10-19T21:00:01.074448+00:00",
          "finished_at": "2026-10-19T21:00:02.097889+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/sec_20f.py"
          ],
          "source_codes": [
            "sec_20f"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-19 21:00:02,018 INFO sec_20f DONE sec_20f: fetched=0 new=0 updated=0 matched=0 unmatched=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 174217,
          "table": "cross_listings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "data_quality_metrics": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "data_sources": {
      "latest_related_run": {
        "task": "tsr_bankruptcy",
        "run_id": 31164,
        "started_at": "2026-11-02T10:20:11.121992+00:00",
        "finished_at": "2026-11-02T10:20:18.237151+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/tsr_bankruptcy.py"
        ],
        "source_codes": [
          "tsr_bankruptcy"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179489,
        "table": "data_sources",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "tsr_bankruptcy",
          "run_id": 31164,
          "started_at": "2026-11-02T10:20:11.121992+00:00",
          "finished_at": "2026-11-02T10:20:18.237151+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179489,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "nta_houjin_daily",
          "run_id": 31161,
          "started_at": "2026-11-02T10:00:00.271629+00:00",
          "finished_at": "2026-11-02T10:00:00.911619+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nta_houjin_daily_20261102_100000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_houjin_bangou.py"
          ],
          "source_codes": [
            "nta_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\"mode\": \"daily\", \"dates_processed\": 0, \"rows_read\": 0, \"rows_inserted\": 0, \"rows_updated\": 0}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31157,
          "started_at": "2026-11-02T09:20:11.348872+00:00",
          "finished_at": "2026-11-02T09:20:15.465785+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-02 09:20:15,361 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179331,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "osakaben",
          "run_id": 31099,
          "started_at": "2026-11-02T01:00:00.169523+00:00",
          "finished_at": "2026-11-02T02:13:13.845714+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/osakaben_20261102_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/osakaben.py"
          ],
          "source_codes": [
            "osakaben"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 02:13:13,725 [INFO] osakaben DONE: {'search_ids': 5269, 'fetched': 5269, 'parsed': 5269, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 1, 'updated': 5268}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179238,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "local_public_recognitions",
          "run_id": 31094,
          "started_at": "2026-11-02T00:35:00.091245+00:00",
          "finished_at": "2026-11-02T00:36:20.186381+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "niigata_bengo",
          "run_id": 31089,
          "started_at": "2026-11-02T00:00:00.290401+00:00",
          "finished_at": "2026-11-02T00:01:06.230161+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/niigata_bengo_20261102_000000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/niigata_bengo.py"
          ],
          "source_codes": [
            "niigata_bengo"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 00:01:06,105 [INFO] niigata_bengo DONE: {'kana_fetched': 46, 'kana_failed': 0, 'kana_empty': 14, 'rows_parsed': 266, 'inserted': 0, 'updated': 266, 'db_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179228,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "satsuben",
          "run_id": 31083,
          "started_at": "2026-11-01T23:30:00.133338+00:00",
          "finished_at": "2026-11-01T23:41:40.176407+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/satsuben_20261101_233000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/satsuben.py"
          ],
          "source_codes": [
            "satsuben"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:41:40,054 [INFO] satsuben DONE: {'list_fetched': 44, 'list_failed': 0, 'members_seen': 888, 'profile_fetched': 888, 'profile_failed': 0, 'parsed': 888, 'parse_failed': 0, 'inserted': 0, 'updated': 888}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179222,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tdb_bankruptcy_flash",
          "run_id": 31082,
          "started_at": "2026-11-01T23:25:00.090321+00:00",
          "finished_at": "2026-11-01T23:25:24.160297+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdb_bankruptcy_flash_20261101_232500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdb_bankruptcy_flash.py"
          ],
          "source_codes": [
            "tdb_bankruptcy_flash"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:25:24,079 INFO DONE {'records_fetched': 100, 'records_new': 0, 'records_updated': 100, 'matched_companies': 54, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179221,
          "table": "data_sources",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "disability_welfare_facilities": {
      "latest_related_run": {
        "task": "shougai_fukushi",
        "run_id": 28525,
        "started_at": "2026-10-19T21:00:01.053003+00:00",
        "finished_at": "2026-10-19T21:23:43.217044+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shougai_fukushi_20261019_210000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/shougai_fukushi.py"
        ],
        "source_codes": [
          "shougai_fukushi"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-19 21:23:43,091 INFO shougai_fukushi DONE: {'zip_files': 29, 'records_parsed': 209451, 'inserted': 0, 'updated': 209451, 'matched_corp': 186636, 'no_corp_record': 21240, 'no_corp_match': 1575, 'errors': []}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 174218,
        "table": "disability_welfare_facilities",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 209451,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [
            "日志值 209451 与 crawl_jobs.records_updated=0 不一致；保留日志口径，运行记录可能为默认零或不同汇总范围。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "shougai_fukushi",
        "run_id": 28525,
        "started_at": "2026-10-19T21:00:01.053003+00:00",
        "finished_at": "2026-10-19T21:23:43.217044+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shougai_fukushi_20261019_210000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/shougai_fukushi.py"
        ],
        "source_codes": [
          "shougai_fukushi"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-19 21:23:43,091 INFO shougai_fukushi DONE: {'zip_files': 29, 'records_parsed': 209451, 'inserted': 0, 'updated': 209451, 'matched_corp': 186636, 'no_corp_record': 21240, 'no_corp_match': 1575, 'errors': []}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 174218,
        "table": "disability_welfare_facilities",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 209451,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [
            "日志值 209451 与 crawl_jobs.records_updated=0 不一致；保留日志口径，运行记录可能为默认零或不同汇总范围。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "shougai_fukushi",
          "run_id": 28525,
          "started_at": "2026-10-19T21:00:01.053003+00:00",
          "finished_at": "2026-10-19T21:23:43.217044+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shougai_fukushi_20261019_210000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/shougai_fukushi.py"
          ],
          "source_codes": [
            "shougai_fukushi"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-19 21:23:43,091 INFO shougai_fukushi DONE: {'zip_files': 29, 'records_parsed': 209451, 'inserted': 0, 'updated': 209451, 'matched_corp': 186636, 'no_corp_record': 21240, 'no_corp_match': 1575, 'errors': []}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 174218,
          "table": "disability_welfare_facilities",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 209451,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [
              "日志值 209451 与 crawl_jobs.records_updated=0 不一致；保留日志口径，运行记录可能为默认零或不同汇总范围。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "edinet_filings": {
      "latest_related_run": {
        "task": "edinet_filings",
        "run_id": 31027,
        "started_at": "2026-11-01T19:10:00.199683+00:00",
        "finished_at": "2026-11-01T19:10:02.776788+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_filings_20261101_191000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_filings.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 19:10:02,705 INFO edinet_filings DONE: days=0 fetched=0 new=0 matched_corp=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "edinet_filings",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": null,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": null,
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "edinet_filings",
        "run_id": 31027,
        "started_at": "2026-11-01T19:10:00.199683+00:00",
        "finished_at": "2026-11-01T19:10:02.776788+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_filings_20261101_191000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_filings.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 19:10:02,705 INFO edinet_filings DONE: days=0 fetched=0 new=0 matched_corp=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "edinet_filings",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": null,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": null,
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "edinet_filings",
          "run_id": 31027,
          "started_at": "2026-11-01T19:10:00.199683+00:00",
          "finished_at": "2026-11-01T19:10:02.776788+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_filings_20261101_191000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_filings.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 19:10:02,705 INFO edinet_filings DONE: days=0 fetched=0 new=0 matched_corp=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "edinet_filings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "run_id": 30844,
          "started_at": "2026-10-31T21:00:00.181674+00:00",
          "finished_at": "2026-10-31T21:00:22.903199+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_filings_weekly_yuho_20261031_210000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_filings.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-31 21:00:22,792 INFO edinet_filings DONE: days=10 fetched=2299 new=0 matched_corp=1978",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "edinet_filings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_filings",
          "run_id": 30823,
          "started_at": "2026-10-31T19:10:00.180672+00:00",
          "finished_at": "2026-10-31T19:10:03.611231+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_filings.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 19:10:03,510 INFO edinet_filings DONE: days=1 fetched=326 new=0 matched_corp=264",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "edinet_filings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_filings_weekly_yuho",
          "run_id": 29474,
          "started_at": "2026-10-24T21:00:00.726489+00:00",
          "finished_at": "2026-10-24T21:00:30.461804+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_filings.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-24 21:00:30,339 INFO edinet_filings DONE: days=9 fetched=2449 new=0 matched_corp=2185",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "edinet_filings",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "entity_resolution_cache": {
      "latest_related_run": {
        "task": "courts_hanrei_pdf_parse",
        "run_id": 31042,
        "started_at": "2026-11-01T20:35:00.09748+00:00",
        "finished_at": "2026-11-01T20:35:01.389301+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/parse_courts_hanrei_pdfs.py"
        ],
        "source_codes": [
          "courts_hanrei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179177,
        "table": "entity_resolution_cache",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 31042,
          "started_at": "2026-11-01T20:35:00.09748+00:00",
          "finished_at": "2026-11-01T20:35:01.389301+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/courts_hanrei_pdf_parse_20261101_203500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:35:01,304 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179177,
          "table": "entity_resolution_cache",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "courts_hanrei_pdf_parse",
          "run_id": 30839,
          "started_at": "2026-10-31T20:35:00.092203+00:00",
          "finished_at": "2026-10-31T20:35:00.862237+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/parse_courts_hanrei_pdfs.py"
          ],
          "source_codes": [
            "courts_hanrei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:35:00,782 INFO done {'seen': 0, 'matched': 0, 'written': 0, 'failed': 0, 'by_status': {}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178790,
          "table": "entity_resolution_cache",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "executive_compensation": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "external_data_source_discoveries": {
      "latest_related_run": {
        "task": "data_go_jp_catalog",
        "run_id": 30045,
        "started_at": "2026-10-27T18:40:00.52695+00:00",
        "finished_at": "2026-10-27T18:42:53.708607+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/data_go_jp_catalog_20261027_184000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/data_go_jp_catalog.py"
        ],
        "source_codes": [
          "data_go_jp_catalog"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-27 18:42:53,580 INFO data_go_jp_catalog DONE fetched=3895 unique=2269 inserted=213 updated=2056 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 177254,
        "table": "external_data_source_discoveries",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 213,
          "updated": 2056,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "data_go_jp_catalog",
        "run_id": 30045,
        "started_at": "2026-10-27T18:40:00.52695+00:00",
        "finished_at": "2026-10-27T18:42:53.708607+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/data_go_jp_catalog_20261027_184000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/data_go_jp_catalog.py"
        ],
        "source_codes": [
          "data_go_jp_catalog"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-27 18:42:53,580 INFO data_go_jp_catalog DONE fetched=3895 unique=2269 inserted=213 updated=2056 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 177254,
        "table": "external_data_source_discoveries",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 213,
          "updated": 2056,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "data_go_jp_catalog",
          "run_id": 30045,
          "started_at": "2026-10-27T18:40:00.52695+00:00",
          "finished_at": "2026-10-27T18:42:53.708607+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/data_go_jp_catalog_20261027_184000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/data_go_jp_catalog.py"
          ],
          "source_codes": [
            "data_go_jp_catalog"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-27 18:42:53,580 INFO data_go_jp_catalog DONE fetched=3895 unique=2269 inserted=213 updated=2056 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 177254,
          "table": "external_data_source_discoveries",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 213,
            "updated": 2056,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "data_go_jp_catalog",
          "run_id": 28701,
          "started_at": "2026-10-20T18:40:00.324025+00:00",
          "finished_at": "2026-10-20T18:47:01.93947+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/data_go_jp_catalog.py"
          ],
          "source_codes": [
            "data_go_jp_catalog"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-20 18:47:01,785 INFO data_go_jp_catalog DONE fetched=15040 unique=4804 inserted=21 updated=4783 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 174595,
          "table": "external_data_source_discoveries",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 21,
            "updated": 4783,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "field_lineage": {
      "latest_related_run": {
        "task": "npo_facilities",
        "run_id": 27646,
        "started_at": "2026-10-15T01:00:01.42871+00:00",
        "finished_at": "2026-10-15T05:00:06.809162+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/npo_facilities_20261015_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/npo_facilities.py"
        ],
        "source_codes": [
          "npo_houjin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "field_lineage",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "npo_facilities",
          "run_id": 27646,
          "started_at": "2026-10-15T01:00:01.42871+00:00",
          "finished_at": "2026-10-15T05:00:06.809162+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/npo_facilities_20261015_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/npo_facilities.py"
          ],
          "source_codes": [
            "npo_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "field_lineage",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "npo_facilities",
          "run_id": 22090,
          "started_at": "2026-09-15T01:00:00.39192+00:00",
          "finished_at": "2026-09-15T05:00:05.703634+00:00",
          "status": "timeout",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/npo_facilities.py"
          ],
          "source_codes": [
            "npo_houjin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "field_lineage",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "financial_statements": {
      "latest_related_run": {
        "task": "edinet_xbrl",
        "run_id": 31030,
        "started_at": "2026-11-01T19:30:00.156683+00:00",
        "finished_at": "2026-11-01T21:05:47.103271+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_xbrl_20261101_193000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 21:05:46,986 INFO edinet DONE: {'fetched': 3349, 'new': 38, 'updated': 0, 'skip': 3310, 'errors': 1003}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "financial_statements",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 38,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "edinet_xbrl",
        "run_id": 31030,
        "started_at": "2026-11-01T19:30:00.156683+00:00",
        "finished_at": "2026-11-01T21:05:47.103271+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_xbrl_20261101_193000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 21:05:46,986 INFO edinet DONE: {'fetched': 3349, 'new': 38, 'updated': 0, 'skip': 3310, 'errors': 1003}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "financial_statements",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 38,
          "updated": 0,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "edinet_xbrl",
          "run_id": 31030,
          "started_at": "2026-11-01T19:30:00.156683+00:00",
          "finished_at": "2026-11-01T21:05:47.103271+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_xbrl_20261101_193000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 21:05:46,986 INFO edinet DONE: {'fetched': 3349, 'new': 38, 'updated': 0, 'skip': 3310, 'errors': 1003}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "financial_statements",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 38,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_xbrl",
          "run_id": 30826,
          "started_at": "2026-10-31T19:30:00.263034+00:00",
          "finished_at": "2026-10-31T21:05:24.842312+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 21:05:24,727 INFO edinet DONE: {'fetched': 3349, 'new': 38, 'updated': 0, 'skip': 3310, 'errors': 1003}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "financial_statements",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 38,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "kanpo_tremolo",
          "run_id": 29877,
          "started_at": "2026-10-26T21:30:00.859977+00:00",
          "finished_at": "2026-10-26T21:53:05.011639+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kanpo_tremolo_20261026_213000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kanpo_tremolo.py"
          ],
          "source_codes": [
            "kanpo_tremolo"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-26 21:53:04,894 INFO kanpo_tremolo DONE: {'pages': 30, 'details_seen': 750, 'details_parsed': 750, 'matched': 637, 'unmatched': 113, 'inserted': 0, 'existing': 637, 'parse_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176896,
          "table": "financial_statements",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "kanpo_tremolo",
          "run_id": 28535,
          "started_at": "2026-10-19T21:30:07.554144+00:00",
          "finished_at": "2026-10-19T21:51:40.289852+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/kanpo_tremolo.py"
          ],
          "source_codes": [
            "kanpo_tremolo"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-19 21:51:40,164 INFO kanpo_tremolo DONE: {'pages': 30, 'details_seen': 750, 'details_parsed': 750, 'matched': 637, 'unmatched': 113, 'inserted': 0, 'existing': 637, 'parse_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 174239,
          "table": "financial_statements",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "food_business_licenses": {
      "latest_related_run": {
        "task": "shokuhin_eisei",
        "run_id": 30832,
        "started_at": "2026-10-31T20:00:00.177783+00:00",
        "finished_at": "2026-10-31T20:03:02.826688+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shokuhin_eisei_20261031_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/shokuhin_eisei.py"
        ],
        "source_codes": [
          "shokuhin_eisei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-31 20:03:02,692 INFO shokuhin_eisei DONE datasets=76 ok=26 skipped=50 new=71633 upd=36964",
        "summary_kind": "final_summary_line",
        "structured_job_id": 178784,
        "table": "food_business_licenses",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 71633,
          "updated": 36964,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "shokuhin_eisei",
        "run_id": 30832,
        "started_at": "2026-10-31T20:00:00.177783+00:00",
        "finished_at": "2026-10-31T20:03:02.826688+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shokuhin_eisei_20261031_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/shokuhin_eisei.py"
        ],
        "source_codes": [
          "shokuhin_eisei"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-31 20:03:02,692 INFO shokuhin_eisei DONE datasets=76 ok=26 skipped=50 new=71633 upd=36964",
        "summary_kind": "final_summary_line",
        "structured_job_id": 178784,
        "table": "food_business_licenses",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 71633,
          "updated": 36964,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "shokuhin_eisei",
          "run_id": 30832,
          "started_at": "2026-10-31T20:00:00.177783+00:00",
          "finished_at": "2026-10-31T20:03:02.826688+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/shokuhin_eisei_20261031_200000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/shokuhin_eisei.py"
          ],
          "source_codes": [
            "shokuhin_eisei"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:03:02,692 INFO shokuhin_eisei DONE datasets=76 ok=26 skipped=50 new=71633 upd=36964",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178784,
          "table": "food_business_licenses",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 71633,
            "updated": 36964,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "shokuhin_eisei",
          "run_id": 24976,
          "started_at": "2026-09-30T20:00:00.386212+00:00",
          "finished_at": "2026-09-30T20:04:17.510462+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/shokuhin_eisei.py"
          ],
          "source_codes": [
            "shokuhin_eisei"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-30 20:04:17,375 INFO shokuhin_eisei DONE datasets=75 ok=26 skipped=49 new=71760 upd=37086",
          "summary_kind": "final_summary_line",
          "structured_job_id": 167139,
          "table": "food_business_licenses",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 71760,
            "updated": 37086,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "gbizinfo_html_done": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "gbizinfo_representative_done": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "geps_representative_done": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "gis_facility_points": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "gis_zone_polygons": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "gov_revolving_door": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "government_contracts": {
      "latest_related_run": {
        "task": "geps",
        "run_id": 26092,
        "started_at": "2026-10-06T20:00:00.399705+00:00",
        "finished_at": "2026-10-06T20:05:48.179263+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/geps_20261006_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/geps.py"
        ],
        "source_codes": [
          "geps"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-06 20:05:48,057 INFO geps DONE: years=2 rows_total=49194 inserted=49194 matched_corp=48605",
        "summary_kind": "final_summary_line",
        "structured_job_id": 169381,
        "table": "government_contracts",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 49194,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "geps",
        "run_id": 26092,
        "started_at": "2026-10-06T20:00:00.399705+00:00",
        "finished_at": "2026-10-06T20:05:48.179263+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/geps_20261006_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/geps.py"
        ],
        "source_codes": [
          "geps"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-06 20:05:48,057 INFO geps DONE: years=2 rows_total=49194 inserted=49194 matched_corp=48605",
        "summary_kind": "final_summary_line",
        "structured_job_id": 169381,
        "table": "government_contracts",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 49194,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "geps",
          "run_id": 26092,
          "started_at": "2026-10-06T20:00:00.399705+00:00",
          "finished_at": "2026-10-06T20:05:48.179263+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/geps_20261006_200000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/geps.py"
          ],
          "source_codes": [
            "geps"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-06 20:05:48,057 INFO geps DONE: years=2 rows_total=49194 inserted=49194 matched_corp=48605",
          "summary_kind": "final_summary_line",
          "structured_job_id": 169381,
          "table": "government_contracts",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 49194,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "geps",
          "run_id": 20433,
          "started_at": "2026-09-06T20:00:00.74751+00:00",
          "finished_at": "2026-09-06T20:00:41.201181+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/geps.py"
          ],
          "source_codes": [
            "geps"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-06 20:00:41,086 INFO geps DONE: years=2 rows_total=47449 inserted=47449 matched_corp=46863",
          "summary_kind": "final_summary_line",
          "structured_job_id": 158105,
          "table": "government_contracts",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 47449,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "government_procurement_suspensions": {
      "latest_related_run": {
        "task": "government_procurement_suspensions",
        "run_id": 31077,
        "started_at": "2026-11-01T23:10:00.094989+00:00",
        "finished_at": "2026-11-01T23:11:43.636796+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/government_procurement_suspensions_20261101_231000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/government_procurement_suspensions.py"
        ],
        "source_codes": [
          "government_procurement_suspensions"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"records\": 552,\n  \"inserted\": 0,\n  \"risk_new\": 0\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": 179216,
        "table": "government_procurement_suspensions",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "government_procurement_suspensions",
          "run_id": 31077,
          "started_at": "2026-11-01T23:10:00.094989+00:00",
          "finished_at": "2026-11-01T23:11:43.636796+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/government_procurement_suspensions_20261101_231000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/government_procurement_suspensions.py"
          ],
          "source_codes": [
            "government_procurement_suspensions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"records\": 552,\n  \"inserted\": 0,\n  \"risk_new\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179216,
          "table": "government_procurement_suspensions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "government_procurement_suspensions",
          "run_id": 30873,
          "started_at": "2026-10-31T23:10:00.089267+00:00",
          "finished_at": "2026-10-31T23:11:44.973832+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/government_procurement_suspensions.py"
          ],
          "source_codes": [
            "government_procurement_suspensions"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"records\": 553,\n  \"inserted\": 0,\n  \"risk_new\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 178828,
          "table": "government_procurement_suspensions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "hotel_ryokan_registry": {
      "latest_related_run": {
        "task": "hotel_ryokan_intl",
        "run_id": 24974,
        "started_at": "2026-09-30T20:00:00.384498+00:00",
        "finished_at": "2026-09-30T20:02:27.080095+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/hotel_ryokan_intl_20260930_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/hotel_ryokan_intl.py"
        ],
        "source_codes": [
          "hotel_ryokan_intl"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-09-30 20:02:26,978 INFO hotel_ryokan_intl DONE: {'hotel_rows': 944, 'ryokan_rows': 1450, 'inserted': 0, 'updated': 2394, 'skipped_bad': 0, 'matched_corp': 527, 'unmatched_corp': 1867}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167140,
        "table": "hotel_ryokan_registry",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 2394,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "hotel_ryokan_intl",
        "run_id": 24974,
        "started_at": "2026-09-30T20:00:00.384498+00:00",
        "finished_at": "2026-09-30T20:02:27.080095+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/hotel_ryokan_intl_20260930_200000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/hotel_ryokan_intl.py"
        ],
        "source_codes": [
          "hotel_ryokan_intl"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-09-30 20:02:26,978 INFO hotel_ryokan_intl DONE: {'hotel_rows': 944, 'ryokan_rows': 1450, 'inserted': 0, 'updated': 2394, 'skipped_bad': 0, 'matched_corp': 527, 'unmatched_corp': 1867}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167140,
        "table": "hotel_ryokan_registry",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 2394,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "hotel_ryokan_intl",
          "run_id": 24974,
          "started_at": "2026-09-30T20:00:00.384498+00:00",
          "finished_at": "2026-09-30T20:02:27.080095+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/hotel_ryokan_intl_20260930_200000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/hotel_ryokan_intl.py"
          ],
          "source_codes": [
            "hotel_ryokan_intl"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-09-30 20:02:26,978 INFO hotel_ryokan_intl DONE: {'hotel_rows': 944, 'ryokan_rows': 1450, 'inserted': 0, 'updated': 2394, 'skipped_bad': 0, 'matched_corp': 527, 'unmatched_corp': 1867}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 167140,
          "table": "hotel_ryokan_registry",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 2394,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "intellectual_properties": {
      "latest_related_run": {
        "task": "gbizinfo_ip",
        "run_id": 31127,
        "started_at": "2026-11-02T05:00:00.19302+00:00",
        "finished_at": "2026-11-02T09:00:05.32164+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/gbizinfo_ip_20261102_050000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/gbizinfo_full.py"
        ],
        "source_codes": [
          "gbizinfo"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "intellectual_properties",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "gbizinfo_ip",
          "run_id": 31127,
          "started_at": "2026-11-02T05:00:00.19302+00:00",
          "finished_at": "2026-11-02T09:00:05.32164+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/gbizinfo_ip_20261102_050000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/gbizinfo_full.py"
          ],
          "source_codes": [
            "gbizinfo"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "intellectual_properties",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "gbizinfo_ip",
          "run_id": 30921,
          "started_at": "2026-11-01T05:00:00.192158+00:00",
          "finished_at": "2026-11-01T09:00:05.321679+00:00",
          "status": "timeout",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/gbizinfo_full.py"
          ],
          "source_codes": [
            "gbizinfo"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "intellectual_properties",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "invoice_registrants": {
      "latest_related_run": {
        "task": "invoice_kohyo_api_daily",
        "run_id": 30981,
        "started_at": "2026-11-01T13:30:00.396718+00:00",
        "finished_at": "2026-11-01T13:30:00.921969+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/invoice_kohyo_api_daily_20261101_133000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/import_invoice_via_api.py"
        ],
        "source_codes": [
          "invoice_kohyo_api_v1"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 13:30:00,814 INFO invoice_api DONE: written=0 parsed=0 skipped=0 kojin_name_filled=0 elapsed=0.3s",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179118,
        "table": "invoice_registrants",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 0,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "written"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "invoice_kohyo_api_daily",
        "run_id": 30981,
        "started_at": "2026-11-01T13:30:00.396718+00:00",
        "finished_at": "2026-11-01T13:30:00.921969+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/invoice_kohyo_api_daily_20261101_133000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/import_invoice_via_api.py"
        ],
        "source_codes": [
          "invoice_kohyo_api_v1"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 13:30:00,814 INFO invoice_api DONE: written=0 parsed=0 skipped=0 kojin_name_filled=0 elapsed=0.3s",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179118,
        "table": "invoice_registrants",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 0,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "written"
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "invoice_kohyo_api_daily",
          "run_id": 30981,
          "started_at": "2026-11-01T13:30:00.396718+00:00",
          "finished_at": "2026-11-01T13:30:00.921969+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/invoice_kohyo_api_daily_20261101_133000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_invoice_via_api.py"
          ],
          "source_codes": [
            "invoice_kohyo_api_v1"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 13:30:00,814 INFO invoice_api DONE: written=0 parsed=0 skipped=0 kojin_name_filled=0 elapsed=0.3s",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179118,
          "table": "invoice_registrants",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "written"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "invoice_kohyo_api_daily",
          "run_id": 30777,
          "started_at": "2026-10-31T13:30:00.11553+00:00",
          "finished_at": "2026-10-31T13:30:00.622139+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_invoice_via_api.py"
          ],
          "source_codes": [
            "invoice_kohyo_api_v1"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 13:30:00,537 INFO invoice_api DONE: written=0 parsed=0 skipped=0 kojin_name_filled=0 elapsed=0.3s",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178730,
          "table": "invoice_registrants",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "written"
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "ipa_security_action_declarations": {
      "latest_related_run": {
        "task": "ipa_security_action",
        "run_id": 25339,
        "started_at": "2026-10-02T20:45:00.841667+00:00",
        "finished_at": "2026-10-02T20:57:30.64939+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/ipa_security_action_20261002_204500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/ipa_security_action.py"
        ],
        "source_codes": [
          "ipa_security_action"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 167873,
        "table": "ipa_security_action_declarations",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "ipa_security_action",
          "run_id": 25339,
          "started_at": "2026-10-02T20:45:00.841667+00:00",
          "finished_at": "2026-10-02T20:57:30.64939+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/ipa_security_action_20261002_204500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/ipa_security_action.py"
          ],
          "source_codes": [
            "ipa_security_action"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 167873,
          "table": "ipa_security_action_declarations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "ipa_security_action",
          "run_id": 19646,
          "started_at": "2026-09-02T20:45:00.337522+00:00",
          "finished_at": "2026-09-02T20:49:45.471871+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/ipa_security_action.py"
          ],
          "source_codes": [
            "ipa_security_action"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 156569,
          "table": "ipa_security_action_declarations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "jetro_case_studies": {
      "latest_related_run": {
        "task": "jetro_case_studies",
        "run_id": 25380,
        "started_at": "2026-10-02T23:30:00.584085+00:00",
        "finished_at": "2026-10-02T23:32:49.158348+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jetro_case_studies_20261002_233000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jetro_case_studies.py"
        ],
        "source_codes": [
          "jetro_case_studies"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-02 23:32:49,045 INFO jetro_case_studies DONE stats={'urls_discovered': 621, 'pages_fetched': 621, 'records_parsed': 621, 'records_inserted': 20, 'records_updated': 601, 'parse_errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167918,
        "table": "jetro_case_studies",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 20,
          "updated": 601,
          "write_operations": null,
          "metric_keys": {
            "inserted": "records_inserted",
            "updated": "records_updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "jetro_case_studies",
        "run_id": 25380,
        "started_at": "2026-10-02T23:30:00.584085+00:00",
        "finished_at": "2026-10-02T23:32:49.158348+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jetro_case_studies_20261002_233000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jetro_case_studies.py"
        ],
        "source_codes": [
          "jetro_case_studies"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-02 23:32:49,045 INFO jetro_case_studies DONE stats={'urls_discovered': 621, 'pages_fetched': 621, 'records_parsed': 621, 'records_inserted': 20, 'records_updated': 601, 'parse_errors': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 167918,
        "table": "jetro_case_studies",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 20,
          "updated": 601,
          "write_operations": null,
          "metric_keys": {
            "inserted": "records_inserted",
            "updated": "records_updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "jetro_case_studies",
          "run_id": 25380,
          "started_at": "2026-10-02T23:30:00.584085+00:00",
          "finished_at": "2026-10-02T23:32:49.158348+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jetro_case_studies_20261002_233000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jetro_case_studies.py"
          ],
          "source_codes": [
            "jetro_case_studies"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-02 23:32:49,045 INFO jetro_case_studies DONE stats={'urls_discovered': 621, 'pages_fetched': 621, 'records_parsed': 621, 'records_inserted': 20, 'records_updated': 601, 'parse_errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 167918,
          "table": "jetro_case_studies",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 20,
            "updated": 601,
            "write_operations": null,
            "metric_keys": {
              "inserted": "records_inserted",
              "updated": "records_updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jetro_case_studies",
          "run_id": 19688,
          "started_at": "2026-09-02T23:30:00.592885+00:00",
          "finished_at": "2026-09-02T23:32:39.191494+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/jetro_case_studies.py"
          ],
          "source_codes": [
            "jetro_case_studies"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-02 23:32:38,996 INFO jetro_case_studies DONE stats={'urls_discovered': 601, 'pages_fetched': 601, 'records_parsed': 601, 'records_inserted': 6, 'records_updated': 595, 'parse_errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 156615,
          "table": "jetro_case_studies",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 6,
            "updated": 595,
            "write_operations": null,
            "metric_keys": {
              "inserted": "records_inserted",
              "updated": "records_updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "jftc_subcontract_recommendations": {
      "latest_related_run": {
        "task": "jftc_subcontract_recommendations",
        "run_id": 25369,
        "started_at": "2026-10-02T22:55:00.446642+00:00",
        "finished_at": "2026-10-02T23:15:05.542146+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jftc_subcontract_recommendations_20261002_225500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jftc_subcontract_recommendations.py"
        ],
        "source_codes": [
          "jftc_subcontract_recommendations"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "jftc_subcontract_recommendations",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "jftc_subcontract_recommendations",
          "run_id": 25369,
          "started_at": "2026-10-02T22:55:00.446642+00:00",
          "finished_at": "2026-10-02T23:15:05.542146+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jftc_subcontract_recommendations_20261002_225500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jftc_subcontract_recommendations.py"
          ],
          "source_codes": [
            "jftc_subcontract_recommendations"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "jftc_subcontract_recommendations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "jftc_subcontract_recommendations",
          "run_id": 19679,
          "started_at": "2026-09-02T22:55:00.099887+00:00",
          "finished_at": "2026-09-02T22:55:35.601973+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/jftc_subcontract_recommendations.py"
          ],
          "source_codes": [
            "jftc_subcontract_recommendations"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": "{\n  \"records\": 136,\n  \"inserted\": 0,\n  \"risk_new\": 0,\n  \"matched\": 127,\n  \"errors\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 156606,
          "table": "jftc_subcontract_recommendations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "jgoodtech_company_profiles": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "jgoodtech_representative_done": {
      "latest_related_run": {
        "task": "jgoodtech",
        "run_id": 30061,
        "started_at": "2026-10-27T20:15:00.61567+00:00",
        "finished_at": "2026-10-27T20:42:19.970066+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgoodtech_20261027_201500.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/import_jgoodtech_representatives.py"
        ],
        "source_codes": [
          "jgoodtech"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-27 20:42:19,911 INFO done stats={'search_pages': 700, 'overview_rows': 62442, 'detail_attempts': 55, 'done_skip': 62387, 'found': 38, 'not_found': 17, 'skipped_existing': 6, 'company_missing': 0, 'errors': 0, 'persons_new': 32, 'persons_reused': 0, 'officers_new': 32, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261027.jsonl",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "jgoodtech_representative_done",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "jgoodtech",
          "run_id": 30061,
          "started_at": "2026-10-27T20:15:00.61567+00:00",
          "finished_at": "2026-10-27T20:42:19.970066+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgoodtech_20261027_201500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-27 20:42:19,911 INFO done stats={'search_pages': 700, 'overview_rows': 62442, 'detail_attempts': 55, 'done_skip': 62387, 'found': 38, 'not_found': 17, 'skipped_existing': 6, 'company_missing': 0, 'errors': 0, 'persons_new': 32, 'persons_reused': 0, 'officers_new': 32, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261027.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "jgoodtech_representative_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "jgoodtech",
          "run_id": 28718,
          "started_at": "2026-10-20T20:15:03.37665+00:00",
          "finished_at": "2026-10-20T20:41:23.931424+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-20 20:41:23,874 INFO done stats={'search_pages': 700, 'overview_rows': 62326, 'detail_attempts': 72, 'done_skip': 62254, 'found': 41, 'not_found': 31, 'skipped_existing': 10, 'company_missing': 0, 'errors': 0, 'persons_new': 31, 'persons_reused': 0, 'officers_new': 31, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261020.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "jgoodtech_representative_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "jpo_trademark_enrichment": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kaigo_service_rep_done": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kaken_research_projects": {
      "latest_related_run": {
        "task": "kaken",
        "run_id": 29917,
        "started_at": "2026-10-26T23:55:00.102137+00:00",
        "finished_at": "2026-10-27T00:20:46.058819+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kaken_20261026_235500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/kaken_research_projects.py"
        ],
        "source_codes": [
          "kaken"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 176940,
        "table": "kaken_research_projects",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "kaken",
          "run_id": 29917,
          "started_at": "2026-10-26T23:55:00.102137+00:00",
          "finished_at": "2026-10-27T00:20:46.058819+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/kaken_20261026_235500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/kaken_research_projects.py"
          ],
          "source_codes": [
            "kaken"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 176940,
          "table": "kaken_research_projects",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "kaken",
          "run_id": 28576,
          "started_at": "2026-10-19T23:55:00.3273+00:00",
          "finished_at": "2026-10-20T00:16:50.360556+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/kaken_research_projects.py"
          ],
          "source_codes": [
            "kaken"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 174283,
          "table": "kaken_research_projects",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_discovered_urls": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_downstream_links": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_financial_facts": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_issues": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_notice_entities": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_notices": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "kanpo_source_records": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "land_prices": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "laws": {
      "latest_related_run": {
        "task": "egov_law",
        "run_id": 31145,
        "started_at": "2026-11-02T08:00:00.835027+00:00",
        "finished_at": "2026-11-02T08:01:27.910854+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/egov_law_20261102_080000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/egov_law.py"
        ],
        "source_codes": [
          "egov_law"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 08:01:27,807 INFO egov_law DONE: fetched=9588 new=0 updated=9588 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179284,
        "table": "laws",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 9588,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "egov_law",
        "run_id": 31145,
        "started_at": "2026-11-02T08:00:00.835027+00:00",
        "finished_at": "2026-11-02T08:01:27.910854+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/egov_law_20261102_080000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/egov_law.py"
        ],
        "source_codes": [
          "egov_law"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 08:01:27,807 INFO egov_law DONE: fetched=9588 new=0 updated=9588 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179284,
        "table": "laws",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 9588,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "egov_law",
          "run_id": 31145,
          "started_at": "2026-11-02T08:00:00.835027+00:00",
          "finished_at": "2026-11-02T08:01:27.910854+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/egov_law_20261102_080000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/egov_law.py"
          ],
          "source_codes": [
            "egov_law"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 08:01:27,807 INFO egov_law DONE: fetched=9588 new=0 updated=9588 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179284,
          "table": "laws",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 9588,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "egov_law",
          "run_id": 30940,
          "started_at": "2026-11-01T08:00:01.160282+00:00",
          "finished_at": "2026-11-01T08:01:44.432553+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/egov_law.py"
          ],
          "source_codes": [
            "egov_law"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-01 08:01:44,312 INFO egov_law DONE: fetched=9588 new=0 updated=9588 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178893,
          "table": "laws",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 9588,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "legal_registry_requests": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "local_public_recognition_root_runs": {
      "latest_related_run": {
        "task": "local_public_recognitions",
        "run_id": 31094,
        "started_at": "2026-11-02T00:35:00.091245+00:00",
        "finished_at": "2026-11-02T00:36:20.186381+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/local_public_recognitions.py"
        ],
        "source_codes": [
          "local_public_recognitions"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": null,
        "table": "local_public_recognition_root_runs",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "local_public_recognitions",
          "run_id": 31094,
          "started_at": "2026-11-02T00:35:00.091245+00:00",
          "finished_at": "2026-11-02T00:36:20.186381+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "local_public_recognition_root_runs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "local_public_recognitions",
          "run_id": 30887,
          "started_at": "2026-11-01T00:35:00.171521+00:00",
          "finished_at": "2026-11-01T00:36:33.36691+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 80,\n  \"fetched\": 80,\n  \"parsed\": 0,\n  \"inserted\": 0,\n  \"updated\": 0,\n  \"mirrored_awards\": 0,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "local_public_recognition_root_runs",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "local_public_recognitions": {
      "latest_related_run": {
        "task": "local_public_recognitions",
        "run_id": 31094,
        "started_at": "2026-11-02T00:35:00.091245+00:00",
        "finished_at": "2026-11-02T00:36:20.186381+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/local_public_recognitions.py"
        ],
        "source_codes": [
          "local_public_recognitions"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": null,
        "table": "local_public_recognitions",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "local_public_recognitions",
          "run_id": 31094,
          "started_at": "2026-11-02T00:35:00.091245+00:00",
          "finished_at": "2026-11-02T00:36:20.186381+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "local_public_recognitions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "local_public_recognitions",
          "run_id": 30887,
          "started_at": "2026-11-01T00:35:00.171521+00:00",
          "finished_at": "2026-11-01T00:36:33.36691+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 80,\n  \"fetched\": 80,\n  \"parsed\": 0,\n  \"inserted\": 0,\n  \"updated\": 0,\n  \"mirrored_awards\": 0,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "local_public_recognitions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "material_disclosures": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "medical_facilities": {
      "latest_related_run": {
        "task": "medical_facilities",
        "run_id": 26538,
        "started_at": "2026-10-09T03:00:01.008685+00:00",
        "finished_at": "2026-10-09T03:07:18.633215+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/medical_facilities_20261009_030000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/medical_facilities.py"
        ],
        "source_codes": [
          "medical_facilities"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 170181,
        "table": "medical_facilities",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "medical_facilities",
          "run_id": 26538,
          "started_at": "2026-10-09T03:00:01.008685+00:00",
          "finished_at": "2026-10-09T03:07:18.633215+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/medical_facilities_20261009_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/medical_facilities.py"
          ],
          "source_codes": [
            "medical_facilities"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 170181,
          "table": "medical_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "medical_facilities",
          "run_id": 20938,
          "started_at": "2026-09-09T03:00:00.727441+00:00",
          "finished_at": "2026-09-09T03:13:25.519041+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/medical_facilities.py"
          ],
          "source_codes": [
            "medical_facilities"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 158974,
          "table": "medical_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "moj_e_koukoku_notice_documents": {
      "latest_related_run": {
        "task": "moj_e_koukoku",
        "run_id": 31156,
        "started_at": "2026-11-02T09:20:02.391112+00:00",
        "finished_at": "2026-11-02T09:20:06.961691+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/moj_e_koukoku_20261102_092000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/moj_e_koukoku.py"
        ],
        "source_codes": [
          "moj_e_koukoku"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": 179329,
        "table": "moj_e_koukoku_notice_documents",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "moj_e_koukoku",
          "run_id": 31156,
          "started_at": "2026-11-02T09:20:02.391112+00:00",
          "finished_at": "2026-11-02T09:20:06.961691+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/moj_e_koukoku_20261102_092000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/moj_e_koukoku.py"
          ],
          "source_codes": [
            "moj_e_koukoku"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179329,
          "table": "moj_e_koukoku_notice_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "moj_e_koukoku",
          "run_id": 31117,
          "started_at": "2026-11-02T03:20:00.146579+00:00",
          "finished_at": "2026-11-02T03:20:01.654548+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/moj_e_koukoku.py"
          ],
          "source_codes": [
            "moj_e_koukoku"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179255,
          "table": "moj_e_koukoku_notice_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "moj_e_koukoku_notices": {
      "latest_related_run": {
        "task": "moj_e_koukoku",
        "run_id": 31156,
        "started_at": "2026-11-02T09:20:02.391112+00:00",
        "finished_at": "2026-11-02T09:20:06.961691+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/moj_e_koukoku_20261102_092000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/moj_e_koukoku.py"
        ],
        "source_codes": [
          "moj_e_koukoku"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": 179329,
        "table": "moj_e_koukoku_notices",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "moj_e_koukoku",
          "run_id": 31156,
          "started_at": "2026-11-02T09:20:02.391112+00:00",
          "finished_at": "2026-11-02T09:20:06.961691+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/moj_e_koukoku_20261102_092000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/moj_e_koukoku.py"
          ],
          "source_codes": [
            "moj_e_koukoku"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179329,
          "table": "moj_e_koukoku_notices",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "moj_e_koukoku",
          "run_id": 31117,
          "started_at": "2026-11-02T03:20:00.146579+00:00",
          "finished_at": "2026-11-02T03:20:01.654548+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/moj_e_koukoku.py"
          ],
          "source_codes": [
            "moj_e_koukoku"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179255,
          "table": "moj_e_koukoku_notices",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "municipalities_lookup": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "mv_company_risk_summary": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "news_mentions": {
      "latest_related_run": {
        "task": "tdnet",
        "run_id": 31165,
        "started_at": "2026-11-02T10:35:15.861583+00:00",
        "finished_at": "2026-11-02T10:37:01.501592+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/tdnet.py"
        ],
        "source_codes": [
          "tdnet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179490,
        "table": "news_mentions",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": {
        "task": "prtimes",
        "run_id": 31147,
        "started_at": "2026-11-02T08:15:11.761978+00:00",
        "finished_at": "2026-11-02T09:26:15.761629+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/prtimes_20261102_081500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/prtimes.py"
        ],
        "source_codes": [
          "prtimes"
        ],
        "is_latest_task_run": false,
        "current_task_status": "running",
        "summary_line": "2026-11-02 09:26:15,504 INFO prtimes DONE: {'sitemap_items': 2126, 'details_seen': 2126, 'details_parsed': 2125, 'matched': 1083, 'low_conf_match': 308, 'unmatched': 734, 'inserted': 2125, 'parse_failed': 1}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179286,
        "table": "news_mentions",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 2125,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "tdnet",
          "run_id": 31165,
          "started_at": "2026-11-02T10:35:15.861583+00:00",
          "finished_at": "2026-11-02T10:37:01.501592+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179490,
          "table": "news_mentions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "prtimes",
          "run_id": 31163,
          "started_at": "2026-11-02T10:15:06.567548+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/prtimes.py"
          ],
          "source_codes": [
            "prtimes"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "news_mentions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "tdnet",
          "run_id": 31162,
          "started_at": "2026-11-02T10:05:07.461588+00:00",
          "finished_at": "2026-11-02T10:06:56.18162+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 1, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179487,
          "table": "news_mentions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "prtimes",
          "run_id": 31147,
          "started_at": "2026-11-02T08:15:11.761978+00:00",
          "finished_at": "2026-11-02T09:26:15.761629+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/prtimes_20261102_081500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/prtimes.py"
          ],
          "source_codes": [
            "prtimes"
          ],
          "is_latest_task_run": false,
          "current_task_status": "running",
          "summary_line": "2026-11-02 09:26:15,504 INFO prtimes DONE: {'sitemap_items': 2126, 'details_seen': 2126, 'details_parsed': 2125, 'matched': 1083, 'low_conf_match': 308, 'unmatched': 734, 'inserted': 2125, 'parse_failed': 1}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179286,
          "table": "news_mentions",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 2125,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "news_mentions_2026": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "news_mentions_default": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "nintei_shien_kikan_records": {
      "latest_related_run": {
        "task": "nintei_shien_kikan",
        "run_id": 25357,
        "started_at": "2026-10-02T21:50:00.279071+00:00",
        "finished_at": "2026-10-02T22:57:26.121055+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nintei_shien_kikan_20261002_215000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/nintei_shien_kikan.py"
        ],
        "source_codes": [
          "nintei_shien_kikan"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 167891,
        "table": "nintei_shien_kikan_records",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "nintei_shien_kikan",
          "run_id": 25357,
          "started_at": "2026-10-02T21:50:00.279071+00:00",
          "finished_at": "2026-10-02T22:57:26.121055+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/nintei_shien_kikan_20261002_215000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/nintei_shien_kikan.py"
          ],
          "source_codes": [
            "nintei_shien_kikan"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 167891,
          "table": "nintei_shien_kikan_records",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "nintei_shien_kikan",
          "run_id": 19666,
          "started_at": "2026-09-02T21:50:00.652468+00:00",
          "finished_at": "2026-09-02T22:55:47.262175+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/nintei_shien_kikan.py"
          ],
          "source_codes": [
            "nintei_shien_kikan"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 156588,
          "table": "nintei_shien_kikan_records",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "npo_facilities": {
      "latest_related_run": {
        "task": "npo_facilities",
        "run_id": 27646,
        "started_at": "2026-10-15T01:00:01.42871+00:00",
        "finished_at": "2026-10-15T05:00:06.809162+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/npo_facilities_20261015_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/npo_facilities.py"
        ],
        "source_codes": [
          "npo_houjin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "npo_facilities",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "npo_facilities",
          "run_id": 27646,
          "started_at": "2026-10-15T01:00:01.42871+00:00",
          "finished_at": "2026-10-15T05:00:06.809162+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/npo_facilities_20261015_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/npo_facilities.py"
          ],
          "source_codes": [
            "npo_houjin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "npo_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "npo_facilities",
          "run_id": 22090,
          "started_at": "2026-09-15T01:00:00.39192+00:00",
          "finished_at": "2026-09-15T05:00:05.703634+00:00",
          "status": "timeout",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/npo_facilities.py"
          ],
          "source_codes": [
            "npo_houjin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "npo_facilities",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "officers": {
      "latest_related_run": {
        "task": "edinet_officers",
        "run_id": 31064,
        "started_at": "2026-11-01T22:00:00.183944+00:00",
        "finished_at": "2026-11-01T22:15:33.783949+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officers_20261101_220000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_officers.py"
        ],
        "source_codes": [
          "edinet_officers"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 22:15:33,651 INFO edinet_officers DONE: {'fetched': 345, 'new': 1, 'updated': 0, 'skip_no_section': 172, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 10}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179198,
        "table": "officers",
        "attribution": "reviewed_counter_scope",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 10,
          "metric_keys": {
            "write_operations": "rows_written"
          },
          "notes": [
            "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
      },
      "latest_attributable_run": {
        "task": "edinet_officers",
        "run_id": 31064,
        "started_at": "2026-11-01T22:00:00.183944+00:00",
        "finished_at": "2026-11-01T22:15:33.783949+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officers_20261101_220000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/edinet_officers.py"
        ],
        "source_codes": [
          "edinet_officers"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-01 22:15:33,651 INFO edinet_officers DONE: {'fetched': 345, 'new': 1, 'updated': 0, 'skip_no_section': 172, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 10}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179198,
        "table": "officers",
        "attribution": "reviewed_counter_scope",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 10,
          "metric_keys": {
            "write_operations": "rows_written"
          },
          "notes": [
            "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
      },
      "other_runs": [
        {
          "task": "edinet_officers",
          "run_id": 31064,
          "started_at": "2026-11-01T22:00:00.183944+00:00",
          "finished_at": "2026-11-01T22:15:33.783949+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officers_20261101_220000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_officers.py"
          ],
          "source_codes": [
            "edinet_officers"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 22:15:33,651 INFO edinet_officers DONE: {'fetched': 345, 'new': 1, 'updated': 0, 'skip_no_section': 172, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 10}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179198,
          "table": "officers",
          "attribution": "reviewed_counter_scope",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 10,
            "metric_keys": {
              "write_operations": "rows_written"
            },
            "notes": [
              "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
        },
        {
          "task": "edinet_officer_changes",
          "run_id": 31041,
          "started_at": "2026-11-01T20:30:00.157588+00:00",
          "finished_at": "2026-11-01T20:39:05.525188+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officer_changes_20261101_203000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_officer_changes.py"
          ],
          "source_codes": [
            "edinet_officer_changes"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:39:05,444 INFO edinet_officer_changes DONE: {'docs_seen': 431, 'docs_ok': 0, 'docs_error': 0, 'docs_no_xbrl': 0, 'docs_no_block': 0, 'docs_no_resign': 431, 'resignations_parsed': 0, 'updated': 0, 'inserted': 0, 'noop': 0, 'appoint_skipped': 322}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179175,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officer_changes",
          "run_id": 30837,
          "started_at": "2026-10-31T20:30:00.154208+00:00",
          "finished_at": "2026-10-31T20:39:09.359482+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_officer_changes.py"
          ],
          "source_codes": [
            "edinet_officer_changes"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:39:09,276 INFO edinet_officer_changes DONE: {'docs_seen': 431, 'docs_ok': 0, 'docs_error': 0, 'docs_no_xbrl': 0, 'docs_no_block': 0, 'docs_no_resign': 431, 'resignations_parsed': 0, 'updated': 0, 'inserted': 0, 'noop': 0, 'appoint_skipped': 322}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178788,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "jgoodtech",
          "run_id": 30061,
          "started_at": "2026-10-27T20:15:00.61567+00:00",
          "finished_at": "2026-10-27T20:42:19.970066+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgoodtech_20261027_201500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-27 20:42:19,911 INFO done stats={'search_pages': 700, 'overview_rows': 62442, 'detail_attempts': 55, 'done_skip': 62387, 'found': 38, 'not_found': 17, 'skipped_existing': 6, 'company_missing': 0, 'errors': 0, 'persons_new': 32, 'persons_reused': 0, 'officers_new': 32, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261027.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officers",
          "run_id": 29684,
          "started_at": "2026-10-25T22:00:00.571474+00:00",
          "finished_at": "2026-10-25T22:18:53.19676+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_officers.py"
          ],
          "source_codes": [
            "edinet_officers"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-25 22:18:53,101 INFO edinet_officers DONE: {'fetched': 343, 'new': 0, 'updated': 0, 'skip_no_section': 171, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176506,
          "table": "officers",
          "attribution": "reviewed_counter_scope",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 0,
            "metric_keys": {
              "write_operations": "rows_written"
            },
            "notes": [
              "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "役员程序明确记录役员行写入数；不把 new 文档数当作新增役员。"
        },
        {
          "task": "jgoodtech",
          "run_id": 28718,
          "started_at": "2026-10-20T20:15:03.37665+00:00",
          "finished_at": "2026-10-20T20:41:23.931424+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-20 20:41:23,874 INFO done stats={'search_pages': 700, 'overview_rows': 62326, 'detail_attempts': 72, 'done_skip': 62254, 'found': 41, 'not_found': 31, 'skipped_existing': 10, 'company_missing': 0, 'errors': 0, 'persons_new': 31, 'persons_reused': 0, 'officers_new': 31, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261020.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "saitama_medical_corporation_reports",
          "run_id": 26678,
          "started_at": "2026-10-09T22:00:00.990241+00:00",
          "finished_at": "2026-10-09T22:43:05.359991+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/saitama_medical_corporation_reports_20261009_220000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_saitama_medical_corporation_reps.py"
          ],
          "source_codes": [
            "saitama_medical_corporation_reports"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"include_existing\": false,\n  \"out\": \"/tyc-japan/tyc-japan/data/medical_corporations/saitama/saitama_medical_corporation_reps_20261009.jsonl\",\n  \"page_url\": \"https://www.pref.saitama.lg.jp/a0703/houjinkessan/r6-kessan.html\",\n  \"skip_pdfs\": 0,\n  \"source_code\": \"saitama_medical_corporation_reports\",\n  \"stats\": {\n    \"ambiguous_name_no_address_match\": 3,\n    \"matched_companies\": 266,\n    \"matched_source_records\": 266,\n    \"member_name_unparsed\": 2,\n    \"no_name_match\": 12,\n    \"ocr_250_psm6\": 557,\n    \"ocr_300_psm11\": 557,\n    \"ocr_300_psm6\": 557,\n    \"officers_new\": 24,\n    \"parsed_records\": 281,\n    \"pdf_members\": 637,\n    \"pdfs_seen_total\": 600,\n    \"pdftotext_nonempty\": 1,\n    \"representative_no_consensus\": 238,\n    \"representative_not_found\": 79,\n    \"skipped_existing_officer\": 242,\n    \"source_zip_links\": 27,\n    \"zips_downloaded_or_cached\": 12\n  }\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "gunma_medical_corporation_reports",
          "run_id": 26670,
          "started_at": "2026-10-09T21:30:00.653772+00:00",
          "finished_at": "2026-10-09T21:31:44.479645+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/gunma_medical_corporation_reports_20261009_213000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_gunma_medical_corporation_reps.py"
          ],
          "source_codes": [
            "gunma_medical_corporation_reports"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"include_existing\": false,\n  \"out\": \"/tyc-japan/tyc-japan/data/medical_corporations/gunma/gunma_medical_corporation_reps_20260530.jsonl\",\n  \"page_url\": \"https://www.pref.gunma.jp/page/716575.html\",\n  \"source_code\": \"gunma_medical_corporation_reports\",\n  \"stats\": {\n    \"address_not_found\": 60,\n    \"matched_companies\": 25,\n    \"matched_source_records\": 25,\n    \"no_address_match\": 7,\n    \"no_name_match\": 5,\n    \"ocr_attempted\": 74,\n    \"officers_new\": 3,\n    \"parsed_ocr_first_page\": 10,\n    \"parsed_pdftotext\": 27,\n    \"parsed_records\": 37,\n    \"pdf_members\": 101,\n    \"pdf_no_text\": 3,\n    \"representative_not_found\": 1,\n    \"selected_zip_links\": 144,\n    \"skipped_existing_officer\": 22,\n    \"source_zip_links\": 144,\n    \"zips_downloaded_or_cached\": 6\n  }\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "officers",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "partnership_declaration_pdf_done": {
      "latest_related_run": {
        "task": "partnership_declaration_reps_ocr",
        "run_id": 25921,
        "started_at": "2026-10-05T21:30:00.609759+00:00",
        "finished_at": "2026-10-05T22:27:42.923885+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/partnership_declaration_reps_ocr_20261005_213000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/backfill_partnership_declaration_reps.py"
        ],
        "source_codes": [],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "partnership_declaration_pdf_done",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "partnership_declaration_reps_ocr",
          "run_id": 25921,
          "started_at": "2026-10-05T21:30:00.609759+00:00",
          "finished_at": "2026-10-05T22:27:42.923885+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/partnership_declaration_reps_ocr_20261005_213000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "partnership_declaration_pdf_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "partnership_declaration_reps",
          "run_id": 25711,
          "started_at": "2026-10-04T20:30:00.393266+00:00",
          "finished_at": "2026-10-04T20:30:55.738629+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/partnership_declaration_reps_20261004_203000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "partnership_declaration_pdf_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "partnership_declaration_reps_ocr",
          "run_id": 20253,
          "started_at": "2026-09-05T21:30:00.277399+00:00",
          "finished_at": "2026-09-05T22:14:23.765714+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "partnership_declaration_pdf_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "partnership_declaration_reps",
          "run_id": 20042,
          "started_at": "2026-09-04T20:30:00.64851+00:00",
          "finished_at": "2026-09-04T20:31:59.410217+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/backfill_partnership_declaration_reps.py"
          ],
          "source_codes": [],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-04 20:31:59,288 INFO partnership_declaration_reps done stats={'candidates': 3680, 'found': 1298, 'no_representative': 2382, 'http_error': 0, 'error': 0, 'persons_new': 1284, 'persons_reused': 0, 'officers_new': 1284, 'officers_dup': 14}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "partnership_declaration_pdf_done",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_career_trajectory": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_co_occurrence": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_multi_license": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_officer_stats": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_profile": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_serial_entrepreneur": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "person_shared_address": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "persons": {
      "latest_related_run": {
        "task": "local_public_recognitions",
        "run_id": 31094,
        "started_at": "2026-11-02T00:35:00.091245+00:00",
        "finished_at": "2026-11-02T00:36:20.186381+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/local_public_recognitions.py"
        ],
        "source_codes": [
          "local_public_recognitions"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
        "summary_kind": "stdout_json",
        "structured_job_id": null,
        "table": "persons",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "local_public_recognitions",
          "run_id": 31094,
          "started_at": "2026-11-02T00:35:00.091245+00:00",
          "finished_at": "2026-11-02T00:36:20.186381+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/local_public_recognitions_20261102_003500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 86,\n  \"fetched\": 86,\n  \"parsed\": 1,\n  \"inserted\": 1,\n  \"updated\": 0,\n  \"mirrored_awards\": 1,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officers",
          "run_id": 31064,
          "started_at": "2026-11-01T22:00:00.183944+00:00",
          "finished_at": "2026-11-01T22:15:33.783949+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officers_20261101_220000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_officers.py"
          ],
          "source_codes": [
            "edinet_officers"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 22:15:33,651 INFO edinet_officers DONE: {'fetched': 345, 'new': 1, 'updated': 0, 'skip_no_section': 172, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 10}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179198,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officer_changes",
          "run_id": 31041,
          "started_at": "2026-11-01T20:30:00.157588+00:00",
          "finished_at": "2026-11-01T20:39:05.525188+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_officer_changes_20261101_203000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/edinet_officer_changes.py"
          ],
          "source_codes": [
            "edinet_officer_changes"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:39:05,444 INFO edinet_officer_changes DONE: {'docs_seen': 431, 'docs_ok': 0, 'docs_error': 0, 'docs_no_xbrl': 0, 'docs_no_block': 0, 'docs_no_resign': 431, 'resignations_parsed': 0, 'updated': 0, 'inserted': 0, 'noop': 0, 'appoint_skipped': 322}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179175,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "local_public_recognitions",
          "run_id": 30887,
          "started_at": "2026-11-01T00:35:00.171521+00:00",
          "finished_at": "2026-11-01T00:36:33.36691+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/local_public_recognitions.py"
          ],
          "source_codes": [
            "local_public_recognitions"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "{\n  \"urls\": 80,\n  \"fetched\": 80,\n  \"parsed\": 0,\n  \"inserted\": 0,\n  \"updated\": 0,\n  \"mirrored_awards\": 0,\n  \"failed\": 0,\n  \"skipped_host_blocked\": 0,\n  \"root_runs_recorded\": 128\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": null,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officer_changes",
          "run_id": 30837,
          "started_at": "2026-10-31T20:30:00.154208+00:00",
          "finished_at": "2026-10-31T20:39:09.359482+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_officer_changes.py"
          ],
          "source_codes": [
            "edinet_officer_changes"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:39:09,276 INFO edinet_officer_changes DONE: {'docs_seen': 431, 'docs_ok': 0, 'docs_error': 0, 'docs_no_xbrl': 0, 'docs_no_block': 0, 'docs_no_resign': 431, 'resignations_parsed': 0, 'updated': 0, 'inserted': 0, 'noop': 0, 'appoint_skipped': 322}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178788,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "jgoodtech",
          "run_id": 30061,
          "started_at": "2026-10-27T20:15:00.61567+00:00",
          "finished_at": "2026-10-27T20:42:19.970066+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgoodtech_20261027_201500.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-27 20:42:19,911 INFO done stats={'search_pages': 700, 'overview_rows': 62442, 'detail_attempts': 55, 'done_skip': 62387, 'found': 38, 'not_found': 17, 'skipped_existing': 6, 'company_missing': 0, 'errors': 0, 'persons_new': 32, 'persons_reused': 0, 'officers_new': 32, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261027.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "edinet_officers",
          "run_id": 29684,
          "started_at": "2026-10-25T22:00:00.571474+00:00",
          "finished_at": "2026-10-25T22:18:53.19676+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/edinet_officers.py"
          ],
          "source_codes": [
            "edinet_officers"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-25 22:18:53,101 INFO edinet_officers DONE: {'fetched': 343, 'new': 0, 'updated': 0, 'skip_no_section': 171, 'skip_no_officers': 172, 'errors': 0, 'rows_written': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176506,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "jgoodtech",
          "run_id": 28718,
          "started_at": "2026-10-20T20:15:03.37665+00:00",
          "finished_at": "2026-10-20T20:41:23.931424+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/import_jgoodtech_representatives.py"
          ],
          "source_codes": [
            "jgoodtech"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-20 20:41:23,874 INFO done stats={'search_pages': 700, 'overview_rows': 62326, 'detail_attempts': 72, 'done_skip': 62254, 'found': 41, 'not_found': 31, 'skipped_existing': 10, 'company_missing': 0, 'errors': 0, 'persons_new': 31, 'persons_reused': 0, 'officers_new': 31, 'officers_dup': 0} out=/tyc-japan/tyc-japan/data/jgoodtech/jgoodtech_representatives_20261020.jsonl",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "persons",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "pharmacy_registry": {
      "latest_related_run": {
        "task": "yakkyoku_registry",
        "run_id": 26721,
        "started_at": "2026-10-10T03:00:00.356003+00:00",
        "finished_at": "2026-10-10T03:00:14.727652+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/yakkyoku_registry_20261010_030000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/yakkyoku_registry.py"
        ],
        "source_codes": [
          "yakkyoku_registry"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-10 03:00:14,597 INFO yakkyoku_registry DONE datasets=22 ok=4 skipped=18 new=891 upd=1805",
        "summary_kind": "final_summary_line",
        "structured_job_id": 170544,
        "table": "pharmacy_registry",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 891,
          "updated": 1805,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "yakkyoku_registry",
        "run_id": 26721,
        "started_at": "2026-10-10T03:00:00.356003+00:00",
        "finished_at": "2026-10-10T03:00:14.727652+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/yakkyoku_registry_20261010_030000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/yakkyoku_registry.py"
        ],
        "source_codes": [
          "yakkyoku_registry"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-10 03:00:14,597 INFO yakkyoku_registry DONE datasets=22 ok=4 skipped=18 new=891 upd=1805",
        "summary_kind": "final_summary_line",
        "structured_job_id": 170544,
        "table": "pharmacy_registry",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 891,
          "updated": 1805,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "yakkyoku_registry",
          "run_id": 26721,
          "started_at": "2026-10-10T03:00:00.356003+00:00",
          "finished_at": "2026-10-10T03:00:14.727652+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/yakkyoku_registry_20261010_030000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/yakkyoku_registry.py"
          ],
          "source_codes": [
            "yakkyoku_registry"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-10 03:00:14,597 INFO yakkyoku_registry DONE datasets=22 ok=4 skipped=18 new=891 upd=1805",
          "summary_kind": "final_summary_line",
          "structured_job_id": 170544,
          "table": "pharmacy_registry",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 891,
            "updated": 1805,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "yakkyoku_registry",
          "run_id": 21132,
          "started_at": "2026-09-10T03:00:00.708344+00:00",
          "finished_at": "2026-09-10T03:00:21.299888+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/yakkyoku_registry.py"
          ],
          "source_codes": [
            "yakkyoku_registry"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-10 03:00:20,866 INFO yakkyoku_registry DONE datasets=22 ok=3 skipped=19 new=162 upd=1805",
          "summary_kind": "final_summary_line",
          "structured_job_id": 159354,
          "table": "pharmacy_registry",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 162,
            "updated": 1805,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "political_donations": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "political_organization_reports": {
      "latest_related_run": {
        "task": "seiji_shikin",
        "run_id": 25893,
        "started_at": "2026-10-05T19:30:00.470197+00:00",
        "finished_at": "2026-10-05T19:42:14.138506+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/seiji_shikin_20261005_193000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/seiji_shikin.py"
        ],
        "source_codes": [
          "seiji_shikin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-05 19:42:14,034 INFO seiji_shikin DONE: {'reports': 3, 'detail_pages': 66, 'alpha_pages': 330, 'reports_new': 0, 'reports_upd': 7828, 'parse_failed': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 168987,
        "table": "political_organization_reports",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 7828,
          "write_operations": null,
          "metric_keys": {
            "inserted": "reports_new",
            "updated": "reports_upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "seiji_shikin",
        "run_id": 25893,
        "started_at": "2026-10-05T19:30:00.470197+00:00",
        "finished_at": "2026-10-05T19:42:14.138506+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/seiji_shikin_20261005_193000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/seiji_shikin.py"
        ],
        "source_codes": [
          "seiji_shikin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-05 19:42:14,034 INFO seiji_shikin DONE: {'reports': 3, 'detail_pages': 66, 'alpha_pages': 330, 'reports_new': 0, 'reports_upd': 7828, 'parse_failed': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 168987,
        "table": "political_organization_reports",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": 7828,
          "write_operations": null,
          "metric_keys": {
            "inserted": "reports_new",
            "updated": "reports_upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "seiji_shikin",
          "run_id": 25893,
          "started_at": "2026-10-05T19:30:00.470197+00:00",
          "finished_at": "2026-10-05T19:42:14.138506+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/seiji_shikin_20261005_193000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/seiji_shikin.py"
          ],
          "source_codes": [
            "seiji_shikin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-05 19:42:14,034 INFO seiji_shikin DONE: {'reports': 3, 'detail_pages': 66, 'alpha_pages': 330, 'reports_new': 0, 'reports_upd': 7828, 'parse_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 168987,
          "table": "political_organization_reports",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 7828,
            "write_operations": null,
            "metric_keys": {
              "inserted": "reports_new",
              "updated": "reports_upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "seiji_shikin",
          "run_id": 20227,
          "started_at": "2026-09-05T19:30:00.226151+00:00",
          "finished_at": "2026-09-05T19:38:21.543773+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/seiji_shikin.py"
          ],
          "source_codes": [
            "seiji_shikin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-05 19:38:21,439 INFO seiji_shikin DONE: {'reports': 3, 'detail_pages': 66, 'alpha_pages': 330, 'reports_new': 0, 'reports_upd': 7828, 'parse_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 157717,
          "table": "political_organization_reports",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 7828,
            "write_operations": null,
            "metric_keys": {
              "inserted": "reports_new",
              "updated": "reports_upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "politician_corporate_links": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "politicians": {
      "latest_related_run": {
        "task": "diet_pep",
        "run_id": 27488,
        "started_at": "2026-10-14T05:00:00.320963+00:00",
        "finished_at": "2026-10-14T05:00:36.586094+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/diet_pep_20261014_050000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/diet.py"
        ],
        "source_codes": [
          "diet_sangiin",
          "diet_shugiin"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 172065,
        "table": "politicians",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "diet_pep",
          "run_id": 27488,
          "started_at": "2026-10-14T05:00:00.320963+00:00",
          "finished_at": "2026-10-14T05:00:36.586094+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/diet_pep_20261014_050000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/diet.py"
          ],
          "source_codes": [
            "diet_sangiin",
            "diet_shugiin"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 172065,
          "table": "politicians",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "diet_pep",
          "run_id": 21914,
          "started_at": "2026-09-14T05:00:00.207522+00:00",
          "finished_at": "2026-09-14T05:00:37.381745+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/diet.py"
          ],
          "source_codes": [
            "diet_sangiin",
            "diet_shugiin"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 160884,
          "table": "politicians",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "population_mesh_250m": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "professionals": {
      "latest_related_run": {
        "task": "osakaben",
        "run_id": 31099,
        "started_at": "2026-11-02T01:00:00.169523+00:00",
        "finished_at": "2026-11-02T02:13:13.845714+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/osakaben_20261102_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/osakaben.py"
        ],
        "source_codes": [
          "osakaben"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 02:13:13,725 [INFO] osakaben DONE: {'search_ids': 5269, 'fetched': 5269, 'parsed': 5269, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 1, 'updated': 5268}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179238,
        "table": "professionals",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 1,
          "updated": 5268,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "osakaben",
        "run_id": 31099,
        "started_at": "2026-11-02T01:00:00.169523+00:00",
        "finished_at": "2026-11-02T02:13:13.845714+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/osakaben_20261102_010000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/osakaben.py"
        ],
        "source_codes": [
          "osakaben"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 02:13:13,725 [INFO] osakaben DONE: {'search_ids': 5269, 'fetched': 5269, 'parsed': 5269, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 1, 'updated': 5268}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179238,
        "table": "professionals",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 1,
          "updated": 5268,
          "write_operations": null,
          "metric_keys": {
            "inserted": "inserted",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "osakaben",
          "run_id": 31099,
          "started_at": "2026-11-02T01:00:00.169523+00:00",
          "finished_at": "2026-11-02T02:13:13.845714+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/osakaben_20261102_010000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/osakaben.py"
          ],
          "source_codes": [
            "osakaben"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 02:13:13,725 [INFO] osakaben DONE: {'search_ids': 5269, 'fetched': 5269, 'parsed': 5269, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 1, 'updated': 5268}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179238,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 1,
            "updated": 5268,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "benrishi_navi",
          "run_id": 31106,
          "started_at": "2026-11-02T02:00:00.164224+00:00",
          "finished_at": "2026-11-02T02:00:00.77392+00:00",
          "status": "failed",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/benrishi_navi_20261102_020000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/benrishi_navi.py"
          ],
          "source_codes": [
            "benrishi_navi"
          ],
          "is_latest_task_run": true,
          "current_task_status": "failed",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "professionals",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "niigata_bengo",
          "run_id": 31089,
          "started_at": "2026-11-02T00:00:00.290401+00:00",
          "finished_at": "2026-11-02T00:01:06.230161+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/niigata_bengo_20261102_000000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/niigata_bengo.py"
          ],
          "source_codes": [
            "niigata_bengo"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 00:01:06,105 [INFO] niigata_bengo DONE: {'kana_fetched': 46, 'kana_failed': 0, 'kana_empty': 14, 'rows_parsed': 266, 'inserted': 0, 'updated': 266, 'db_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179228,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 266,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "satsuben",
          "run_id": 31083,
          "started_at": "2026-11-01T23:30:00.133338+00:00",
          "finished_at": "2026-11-01T23:41:40.176407+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/satsuben_20261101_233000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/satsuben.py"
          ],
          "source_codes": [
            "satsuben"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:41:40,054 [INFO] satsuben DONE: {'list_fetched': 44, 'list_failed': 0, 'members_seen': 888, 'profile_fetched': 888, 'profile_failed': 0, 'parsed': 888, 'parse_failed': 0, 'inserted': 0, 'updated': 888}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179222,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 888,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "fben",
          "run_id": 31075,
          "started_at": "2026-11-01T23:00:00.169537+00:00",
          "finished_at": "2026-11-01T23:24:18.936092+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/fben_20261101_230000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/fben.py"
          ],
          "source_codes": [
            "fben"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:24:18,815 [INFO] fben DONE: {'search_ids': 1516, 'fetched': 1516, 'parsed': 1516, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 0, 'updated': 1516}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179214,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 1516,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jicpa_registry",
          "run_id": 30899,
          "started_at": "2026-11-01T02:00:00.160943+00:00",
          "finished_at": "2026-11-01T04:11:46.499153+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jicpa_registry_20261101_020000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jicpa_registry.py"
          ],
          "source_codes": [
            "jicpa_registry"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 04:11:46,305 INFO jicpa_registry DONE: {'fetched_list': 50000, 'fetched_detail': 39800, 'empty': 10733, 'parsed': 39800, 'parse_failed': 0, 'fetch_failed': 0, 'new': 86, 'updated': 39714, 'bytes': 1048239354, 'audit': {'fetched': 476, 'parsed': 476, 'new': 0, 'updated': 476, 'parse_failed': 0}}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178853,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 86,
            "updated": 39714,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [
              "日志值 39714 与 crawl_jobs.records_updated=40190 不一致；保留日志口径，运行记录可能为默认零或不同汇总范围。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "osakaben",
          "run_id": 29720,
          "started_at": "2026-10-26T01:00:00.24027+00:00",
          "finished_at": "2026-10-26T02:16:20.439011+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/osakaben.py"
          ],
          "source_codes": [
            "osakaben"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-26 02:16:20,320 [INFO] osakaben DONE: {'search_ids': 5269, 'fetched': 5269, 'parsed': 5269, 'parse_failed': 0, 'fetch_failed': 0, 'inserted': 0, 'updated': 5269}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176546,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 5269,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "niigata_bengo",
          "run_id": 29710,
          "started_at": "2026-10-26T00:00:00.223191+00:00",
          "finished_at": "2026-10-26T00:01:04.838161+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/niigata_bengo.py"
          ],
          "source_codes": [
            "niigata_bengo"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-26 00:01:04,710 [INFO] niigata_bengo DONE: {'kana_fetched': 46, 'kana_failed': 0, 'kana_empty': 14, 'rows_parsed': 266, 'inserted': 0, 'updated': 266, 'db_failed': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 176536,
          "table": "professionals",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 266,
            "write_operations": null,
            "metric_keys": {
              "inserted": "inserted",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "public_representative_clues": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "raw_documents": {
      "latest_related_run": {
        "task": "tdnet",
        "run_id": 31165,
        "started_at": "2026-11-02T10:35:15.861583+00:00",
        "finished_at": "2026-11-02T10:37:01.501592+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/tdnet.py"
        ],
        "source_codes": [
          "tdnet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179490,
        "table": "raw_documents",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "tdnet",
          "run_id": 31165,
          "started_at": "2026-11-02T10:35:15.861583+00:00",
          "finished_at": "2026-11-02T10:37:01.501592+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179490,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31164,
          "started_at": "2026-11-02T10:20:11.121992+00:00",
          "finished_at": "2026-11-02T10:20:18.237151+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179489,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "prtimes",
          "run_id": 31163,
          "started_at": "2026-11-02T10:15:06.567548+00:00",
          "finished_at": null,
          "status": "running",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/prtimes.py"
          ],
          "source_codes": [
            "prtimes"
          ],
          "is_latest_task_run": true,
          "current_task_status": "running",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "tdnet",
          "run_id": 31162,
          "started_at": "2026-11-02T10:05:07.461588+00:00",
          "finished_at": "2026-11-02T10:06:56.18162+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 1, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179487,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "reinfolib",
          "run_id": 31155,
          "started_at": "2026-11-02T09:10:00.961644+00:00",
          "finished_at": "2026-11-02T09:56:32.321609+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/reinfolib_20261102_091000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/reinfolib_incremental.py"
          ],
          "source_codes": [
            "reinfolib"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "prtimes",
          "run_id": 31147,
          "started_at": "2026-11-02T08:15:11.761978+00:00",
          "finished_at": "2026-11-02T09:26:15.761629+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/prtimes_20261102_081500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/prtimes.py"
          ],
          "source_codes": [
            "prtimes"
          ],
          "is_latest_task_run": false,
          "current_task_status": "running",
          "summary_line": "2026-11-02 09:26:15,504 INFO prtimes DONE: {'sitemap_items': 2126, 'details_seen': 2126, 'details_parsed': 2125, 'matched': 1083, 'low_conf_match': 308, 'unmatched': 734, 'inserted': 2125, 'parse_failed': 1}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179286,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31157,
          "started_at": "2026-11-02T09:20:11.348872+00:00",
          "finished_at": "2026-11-02T09:20:15.465785+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-02 09:20:15,361 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179331,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        },
        {
          "task": "moj_e_koukoku",
          "run_id": 31156,
          "started_at": "2026-11-02T09:20:02.391112+00:00",
          "finished_at": "2026-11-02T09:20:06.961691+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/moj_e_koukoku_20261102_092000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/moj_e_koukoku.py"
          ],
          "source_codes": [
            "moj_e_koukoku"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"apply\": true,\n  \"fetch_documents\": false,\n  \"records_fetched\": 308,\n  \"records_new\": 0,\n  \"records_updated\": 308,\n  \"documents_fetched\": 0,\n  \"documents_parsed\": 0,\n  \"documents_parse_failed\": 0\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179329,
          "table": "raw_documents",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务有汇总，但没有该辅助表的独立计数；不把业务表增量复制到辅助表。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "raw_documents_2026_05": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "raw_documents_2026_06": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "raw_documents_default": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "real_estate_transactions": {
      "latest_related_run": {
        "task": "reinfolib",
        "run_id": 31155,
        "started_at": "2026-11-02T09:10:00.961644+00:00",
        "finished_at": "2026-11-02T09:56:32.321609+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/reinfolib_20261102_091000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/reinfolib_incremental.py"
        ],
        "source_codes": [
          "reinfolib"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "real_estate_transactions",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "reinfolib",
          "run_id": 31155,
          "started_at": "2026-11-02T09:10:00.961644+00:00",
          "finished_at": "2026-11-02T09:56:32.321609+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/reinfolib_20261102_091000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/reinfolib_incremental.py"
          ],
          "source_codes": [
            "reinfolib"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "real_estate_transactions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "reinfolib",
          "run_id": 30950,
          "started_at": "2026-11-01T09:10:00.912234+00:00",
          "finished_at": "2026-11-01T09:57:43.224038+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/reinfolib_incremental.py"
          ],
          "source_codes": [
            "reinfolib"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "real_estate_transactions",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "risk_events": {
      "latest_related_run": {
        "task": "tdnet",
        "run_id": 31165,
        "started_at": "2026-11-02T10:35:15.861583+00:00",
        "finished_at": "2026-11-02T10:37:01.501592+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/tdnet.py"
        ],
        "source_codes": [
          "tdnet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179490,
        "table": "risk_events",
        "attribution": "unattributed",
        "counters": null,
        "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
      },
      "latest_attributable_run": {
        "task": "tsr_bankruptcy",
        "run_id": 31164,
        "started_at": "2026-11-02T10:20:11.121992+00:00",
        "finished_at": "2026-11-02T10:20:18.237151+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/tsr_bankruptcy.py"
        ],
        "source_codes": [
          "tsr_bankruptcy"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179489,
        "table": "risk_events",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 0,
          "updated": null,
          "write_operations": null,
          "metric_keys": {
            "inserted": "items_new",
            "updated": null,
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "tdnet",
          "run_id": 31165,
          "started_at": "2026-11-02T10:35:15.861583+00:00",
          "finished_at": "2026-11-02T10:37:01.501592+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdnet_20261102_103500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 0, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179490,
          "table": "risk_events",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31164,
          "started_at": "2026-11-02T10:20:11.121992+00:00",
          "finished_at": "2026-11-02T10:20:18.237151+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tsr_bankruptcy_20261102_102000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:20:18,130 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179489,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "items_new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "tdnet",
          "run_id": 31162,
          "started_at": "2026-11-02T10:05:07.461588+00:00",
          "finished_at": "2026-11-02T10:06:56.18162+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tdnet.py"
          ],
          "source_codes": [
            "tdnet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "✅ TDnet done: {'news': 1, 'risk_events': 0, 'unmatched': 48}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179487,
          "table": "risk_events",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        },
        {
          "task": "tsr_bankruptcy",
          "run_id": 31157,
          "started_at": "2026-11-02T09:20:11.348872+00:00",
          "finished_at": "2026-11-02T09:20:15.465785+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/tsr_bankruptcy.py"
          ],
          "source_codes": [
            "tsr_bankruptcy"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-02 09:20:15,361 INFO DONE: {'items_seen': 10, 'items_new': 0, 'items_skipped': 10, 'errors': 0, 'matched_by_hb': 0, 'matched_by_fuzzy': 0, 'no_match': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179331,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": null,
            "write_operations": null,
            "metric_keys": {
              "inserted": "items_new",
              "updated": null,
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "yakuza_news",
          "run_id": 31086,
          "started_at": "2026-11-01T23:38:00.09453+00:00",
          "finished_at": "2026-11-01T23:42:02.480113+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/yakuza_news_20261101_233800.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/anti_social_public.py"
          ],
          "source_codes": [
            "yakuza_news"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"yakuza_news\": {\n    \"total_posts\": 2966,\n    \"total_pages\": 30,\n    \"pages_fetched\": 30,\n    \"processed\": 2,\n    \"skipped_existing\": 2964,\n    \"new\": 2,\n    \"updated\": 0,\n    \"fail\": 0,\n    \"taxonomy\": {\n      \"categories\": {\n        \"total_terms\": 172,\n        \"total_pages\": 2,\n        \"pages_fetched\": 2,\n        \"terms_parsed\": 172\n      },\n      \"tags\": {\n        \"total_terms\": 1603,\n        \"total_pages\": 17,\n        \"pages_fetched\": 17,\n        \"terms_parsed\": 1603\n      }\n    }\n  }\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179225,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 2,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "yakuza_wiki",
          "run_id": 31084,
          "started_at": "2026-11-01T23:35:00.092903+00:00",
          "finished_at": "2026-11-01T23:39:32.005139+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/yakuza_wiki_20261101_233500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/anti_social_public.py"
          ],
          "source_codes": [
            "yakuza_wiki"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "{\n  \"yakuza_wiki\": {\n    \"list_links\": 20942,\n    \"fetched\": 54,\n    \"skipped_existing\": 20888,\n    \"new\": 35,\n    \"updated\": 0,\n    \"fail\": 19\n  }\n}",
          "summary_kind": "stdout_json",
          "structured_job_id": 179224,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 35,
            "updated": 0,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "tdb_bankruptcy_flash",
          "run_id": 31082,
          "started_at": "2026-11-01T23:25:00.090321+00:00",
          "finished_at": "2026-11-01T23:25:24.160297+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/tdb_bankruptcy_flash_20261101_232500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/tdb_bankruptcy_flash.py"
          ],
          "source_codes": [
            "tdb_bankruptcy_flash"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:25:24,079 INFO DONE {'records_fetched': 100, 'records_new': 0, 'records_updated': 100, 'matched_companies': 54, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179221,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 100,
            "write_operations": null,
            "metric_keys": {
              "inserted": "records_new",
              "updated": "records_updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "seikei_bankruptcies",
          "run_id": 31079,
          "started_at": "2026-11-01T23:15:00.140274+00:00",
          "finished_at": "2026-11-01T23:15:52.184346+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/seikei_bankruptcies_20261101_231500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/seikei_bankruptcies.py"
          ],
          "source_codes": [
            "seikei_bankruptcies"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 23:15:52,095 INFO DONE {'records_fetched': 98, 'records_new': 0, 'records_updated': 98, 'pages_seen': 18, 'matched_companies': 55, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179218,
          "table": "risk_events",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 98,
            "write_operations": null,
            "metric_keys": {
              "inserted": "records_new",
              "updated": "records_updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "risk_events_2024": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "risk_events_2025": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "risk_events_2026": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "risk_events_default": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "scheduler_runs": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "school_institution": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_company_name_bucket_rank": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_company_name_index": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_company_priority_sitemap_index": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_company_sitemap_prefixes": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_invoice_sitemap_prefixes": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_person_name_bucket_rank": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_person_name_index": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_person_priority_index": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "seo_person_sitemap_prefixes": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "shareholders": {
      "latest_related_run": {
        "task": "edinet_shareholders",
        "run_id": 30110,
        "started_at": "2026-10-28T00:00:00.231719+00:00",
        "finished_at": "2026-10-28T00:01:22.613416+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_shareholders_20261028_000000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/fetch_edinet_shareholders.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-28 00:01:22,505 INFO DONE: {'processed': 521, 'fetched': 521, 'parsed': 382, 'rows_ins': 814, 'rows_upd': 74, 'skipped_unresolved': 5, 'fail': 139, 'start': 1793145600.5040767}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "shareholders",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 814,
          "updated": 74,
          "write_operations": null,
          "metric_keys": {
            "inserted": "rows_ins",
            "updated": "rows_upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "edinet_shareholders",
        "run_id": 30110,
        "started_at": "2026-10-28T00:00:00.231719+00:00",
        "finished_at": "2026-10-28T00:01:22.613416+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_shareholders_20261028_000000.log",
        "log_file_matched": true,
        "programs": [
          "backend/scripts/fetch_edinet_shareholders.py"
        ],
        "source_codes": [
          "edinet"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-28 00:01:22,505 INFO DONE: {'processed': 521, 'fetched': 521, 'parsed': 382, 'rows_ins': 814, 'rows_upd': 74, 'skipped_unresolved': 5, 'fail': 139, 'start': 1793145600.5040767}",
        "summary_kind": "final_summary_line",
        "structured_job_id": null,
        "table": "shareholders",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 814,
          "updated": 74,
          "write_operations": null,
          "metric_keys": {
            "inserted": "rows_ins",
            "updated": "rows_upd",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "edinet_shareholders",
          "run_id": 30110,
          "started_at": "2026-10-28T00:00:00.231719+00:00",
          "finished_at": "2026-10-28T00:01:22.613416+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/edinet_shareholders_20261028_000000.log",
          "log_file_matched": true,
          "programs": [
            "backend/scripts/fetch_edinet_shareholders.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-28 00:01:22,505 INFO DONE: {'processed': 521, 'fetched': 521, 'parsed': 382, 'rows_ins': 814, 'rows_upd': 74, 'skipped_unresolved': 5, 'fail': 139, 'start': 1793145600.5040767}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "shareholders",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 814,
            "updated": 74,
            "write_operations": null,
            "metric_keys": {
              "inserted": "rows_ins",
              "updated": "rows_upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "edinet_shareholders",
          "run_id": 28765,
          "started_at": "2026-10-21T00:00:00.521616+00:00",
          "finished_at": "2026-10-21T00:01:04.870786+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/scripts/fetch_edinet_shareholders.py"
          ],
          "source_codes": [
            "edinet"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-21 00:01:04,757 INFO DONE: {'processed': 369, 'fetched': 369, 'parsed': 230, 'rows_ins': 393, 'rows_upd': 71, 'skipped_unresolved': 3, 'fail': 139, 'start': 1792540800.7393498}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "shareholders",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 393,
            "updated": 71,
            "write_operations": null,
            "metric_keys": {
              "inserted": "rows_ins",
              "updated": "rows_upd",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "smart_sme_supporters": {
      "latest_related_run": {
        "task": "smart_sme_supporter",
        "run_id": 25366,
        "started_at": "2026-10-02T22:40:01.134404+00:00",
        "finished_at": "2026-10-02T22:48:00.652264+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/smart_sme_supporter_20261002_224000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/smart_sme_supporter.py"
        ],
        "source_codes": [
          "smart_sme_supporter"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": 167902,
        "table": "smart_sme_supporters",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "smart_sme_supporter",
          "run_id": 25366,
          "started_at": "2026-10-02T22:40:01.134404+00:00",
          "finished_at": "2026-10-02T22:48:00.652264+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/smart_sme_supporter_20261002_224000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/smart_sme_supporter.py"
          ],
          "source_codes": [
            "smart_sme_supporter"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 167902,
          "table": "smart_sme_supporters",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "smart_sme_supporter",
          "run_id": 19675,
          "started_at": "2026-09-02T22:40:00.108467+00:00",
          "finished_at": "2026-09-02T22:47:10.122702+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/smart_sme_supporter.py"
          ],
          "source_codes": [
            "smart_sme_supporter"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": 156600,
          "table": "smart_sme_supporters",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "station_passengers": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "subsidy_programs": {
      "latest_related_run": {
        "task": "jgrants",
        "run_id": 31149,
        "started_at": "2026-11-02T08:30:01.1036+00:00",
        "finished_at": "2026-11-02T10:17:45.162049+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgrants_20261102_083000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jgrants.py"
        ],
        "source_codes": [
          "jgrants"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 10:17:45,021 INFO jgrants DONE: fetched=3948 new=3 updated=3945 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179288,
        "table": "subsidy_programs",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 3,
          "updated": 3945,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "jgrants",
        "run_id": 31149,
        "started_at": "2026-11-02T08:30:01.1036+00:00",
        "finished_at": "2026-11-02T10:17:45.162049+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgrants_20261102_083000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/jgrants.py"
        ],
        "source_codes": [
          "jgrants"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-11-02 10:17:45,021 INFO jgrants DONE: fetched=3948 new=3 updated=3945 errors=0",
        "summary_kind": "final_summary_line",
        "structured_job_id": 179288,
        "table": "subsidy_programs",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": 3,
          "updated": 3945,
          "write_operations": null,
          "metric_keys": {
            "inserted": "new",
            "updated": "updated",
            "write_operations": null
          },
          "notes": [],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "jgrants",
          "run_id": 31149,
          "started_at": "2026-11-02T08:30:01.1036+00:00",
          "finished_at": "2026-11-02T10:17:45.162049+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jgrants_20261102_083000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jgrants.py"
          ],
          "source_codes": [
            "jgrants"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-02 10:17:45,021 INFO jgrants DONE: fetched=3948 new=3 updated=3945 errors=0",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179288,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 3,
            "updated": 3945,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "run_id": 31035,
          "started_at": "2026-11-01T19:55:00.172046+00:00",
          "finished_at": "2026-11-01T20:03:31.945242+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/hojyokin_portal_support_programs_snapshot_enrichment_20261101_195500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/hojyokin_portal.py"
          ],
          "source_codes": [
            "hojyokin_portal"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 20:03:31,539 INFO hojyokin_portal DONE Hojyokin: {'fetched': 230, 'new': 0, 'updated': 230, 'errors': 270}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179170,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 230,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jnet21_support_programs_prefecture_backfill",
          "run_id": 31020,
          "started_at": "2026-11-01T18:20:00.100618+00:00",
          "finished_at": "2026-11-01T18:51:07.125756+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jnet21_support_programs_prefecture_backfill_20261101_182000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jnet21_support_programs.py"
          ],
          "source_codes": [
            "jnet21_support_programs"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 18:51:07,026 INFO jnet21_support_programs DONE J-Net21: {'fetched': 2437, 'new': 6, 'updated': 2431, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179156,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 6,
            "updated": 2431,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jnet21_support_programs",
          "run_id": 31012,
          "started_at": "2026-11-01T17:45:00.298633+00:00",
          "finished_at": "2026-11-01T17:45:18.595114+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/jnet21_support_programs_20261101_174500.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/jnet21_support_programs.py"
          ],
          "source_codes": [
            "jnet21_support_programs"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-11-01 17:45:18,486 INFO jnet21_support_programs DONE J-Net21: {'fetched': 29, 'new': 0, 'updated': 29, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 179147,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 29,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jgrants",
          "run_id": 30944,
          "started_at": "2026-11-01T08:30:00.591695+00:00",
          "finished_at": "2026-11-01T10:15:32.781746+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/jgrants.py"
          ],
          "source_codes": [
            "jgrants"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-11-01 10:15:32,647 INFO jgrants DONE: fetched=3949 new=1 updated=3948 errors=2",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178897,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 1,
            "updated": 3948,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "hojyokin_portal_support_programs_snapshot_enrichment",
          "run_id": 30831,
          "started_at": "2026-10-31T19:55:00.08911+00:00",
          "finished_at": "2026-10-31T20:03:31.393395+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/hojyokin_portal.py"
          ],
          "source_codes": [
            "hojyokin_portal"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 20:03:30,991 INFO hojyokin_portal DONE Hojyokin: {'fetched': 244, 'new': 0, 'updated': 244, 'errors': 256}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 178783,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 244,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "jnet21_support_programs",
          "run_id": 30808,
          "started_at": "2026-10-31T17:45:00.181524+00:00",
          "finished_at": "2026-10-31T17:45:18.778943+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/jnet21_support_programs.py"
          ],
          "source_codes": [
            "jnet21_support_programs"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-10-31 17:45:18,677 INFO jnet21_support_programs DONE J-Net21: {'fetched': 29, 'new': 0, 'updated': 29, 'errors': 0}",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 0,
            "updated": 29,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "hojyokin_portal_support_programs_historical_snapshot",
          "run_id": 29847,
          "started_at": "2026-10-26T19:10:00.355968+00:00",
          "finished_at": "2026-10-26T19:43:06.799817+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/hojyokin_portal_support_programs_historical_snapshot_20261026_191000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/hojyokin_portal.py"
          ],
          "source_codes": [
            "hojyokin_portal"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-26 19:43:06,687 INFO hojyokin_portal DONE Hojyokin list snapshots: {'fetched': 9320, 'new': 1020, 'updated': 8300, 'errors': 0} errors=44",
          "summary_kind": "final_summary_line",
          "structured_job_id": null,
          "table": "subsidy_programs",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": 1020,
            "updated": 8300,
            "write_operations": null,
            "metric_keys": {
              "inserted": "new",
              "updated": "updated",
              "write_operations": null
            },
            "notes": [],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "university_startups": {
      "latest_related_run": {
        "task": "daigaku_hatsu_vc",
        "run_id": 27298,
        "started_at": "2026-10-13T05:00:00.530044+00:00",
        "finished_at": "2026-10-13T05:00:52.177979+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/daigaku_hatsu_vc_20261013_050000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/daigaku_hatsu_vc.py"
        ],
        "source_codes": [
          "daigaku_hatsu_vc"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-13 05:00:52,038 INFO daigaku_hatsu_vc DONE: {'xlsx_bytes': 1100925, 'rows_parsed': 1456, 'deleted': 1455, 'inserted': 1455, 'matched_corp': 1426, 'unmatched_corp': 12, 'no_corp_number': 14}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 171690,
        "table": "university_startups",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 1455,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "latest_attributable_run": {
        "task": "daigaku_hatsu_vc",
        "run_id": 27298,
        "started_at": "2026-10-13T05:00:00.530044+00:00",
        "finished_at": "2026-10-13T05:00:52.177979+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/daigaku_hatsu_vc_20261013_050000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/daigaku_hatsu_vc.py"
        ],
        "source_codes": [
          "daigaku_hatsu_vc"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": "2026-10-13 05:00:52,038 INFO daigaku_hatsu_vc DONE: {'xlsx_bytes': 1100925, 'rows_parsed': 1456, 'deleted': 1455, 'inserted': 1455, 'matched_corp': 1426, 'unmatched_corp': 12, 'no_corp_number': 14}",
        "summary_kind": "final_summary_line",
        "structured_job_id": 171690,
        "table": "university_startups",
        "attribution": "single_business_output_inferred",
        "counters": {
          "inserted": null,
          "updated": null,
          "write_operations": 1455,
          "metric_keys": {
            "inserted": null,
            "updated": null,
            "write_operations": "inserted"
          },
          "notes": [
            "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
          ],
          "measurement": "task_reported_operations_not_measured_net_delta"
        },
        "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
      },
      "other_runs": [
        {
          "task": "daigaku_hatsu_vc",
          "run_id": 27298,
          "started_at": "2026-10-13T05:00:00.530044+00:00",
          "finished_at": "2026-10-13T05:00:52.177979+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/daigaku_hatsu_vc_20261013_050000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/daigaku_hatsu_vc.py"
          ],
          "source_codes": [
            "daigaku_hatsu_vc"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": "2026-10-13 05:00:52,038 INFO daigaku_hatsu_vc DONE: {'xlsx_bytes': 1100925, 'rows_parsed': 1456, 'deleted': 1455, 'inserted': 1455, 'matched_corp': 1426, 'unmatched_corp': 12, 'no_corp_number': 14}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 171690,
          "table": "university_startups",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 1455,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        },
        {
          "task": "daigaku_hatsu_vc",
          "run_id": 21720,
          "started_at": "2026-09-13T05:00:00.273989+00:00",
          "finished_at": "2026-09-13T05:00:19.198476+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/daigaku_hatsu_vc.py"
          ],
          "source_codes": [
            "daigaku_hatsu_vc"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": "2026-09-13 05:00:18,950 INFO daigaku_hatsu_vc DONE: {'xlsx_bytes': 1100925, 'rows_parsed': 1456, 'deleted': 1551, 'inserted': 1455, 'matched_corp': 1426, 'unmatched_corp': 12, 'no_corp_number': 14}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 160503,
          "table": "university_startups",
          "attribution": "single_business_output_inferred",
          "counters": {
            "inserted": null,
            "updated": null,
            "write_operations": 1455,
            "metric_keys": {
              "inserted": null,
              "updated": null,
              "write_operations": "inserted"
            },
            "notes": [
              "代码存在该表的删除／清空后重写路径；写入操作不等于净新增。"
            ],
            "measurement": "task_reported_operations_not_measured_net_delta"
          },
          "reason": "按已映射的唯一业务输出表推定归属，待人工核对；数字为任务上报，不是数据库前后差分。"
        }
      ],
      "coverage": "has_reported_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "virtual_office_locations": {
      "latest_related_run": {
        "task": "virtual_office_operators",
        "run_id": 30115,
        "started_at": "2026-10-28T00:30:00.17729+00:00",
        "finished_at": "2026-10-28T00:38:34.484598+00:00",
        "status": "success",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/virtual_office_operators_20261028_003000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/virtual_office_operators.py"
        ],
        "source_codes": [
          "virtual_office_operators"
        ],
        "is_latest_task_run": true,
        "current_task_status": "success",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "virtual_office_locations",
        "attribution": "unattributed",
        "counters": null,
        "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "virtual_office_operators",
          "run_id": 30115,
          "started_at": "2026-10-28T00:30:00.17729+00:00",
          "finished_at": "2026-10-28T00:38:34.484598+00:00",
          "status": "success",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/virtual_office_operators_20261028_003000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/virtual_office_operators.py"
          ],
          "source_codes": [
            "virtual_office_operators"
          ],
          "is_latest_task_run": true,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "virtual_office_locations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        },
        {
          "task": "virtual_office_operators",
          "run_id": 28771,
          "started_at": "2026-10-21T00:30:00.260286+00:00",
          "finished_at": "2026-10-21T00:38:33.621033+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/virtual_office_operators.py"
          ],
          "source_codes": [
            "virtual_office_operators"
          ],
          "is_latest_task_run": false,
          "current_task_status": "success",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "virtual_office_locations",
          "attribution": "unattributed",
          "counters": null,
          "reason": "最近完成记录中没有可确认的全任务最终写入汇总；未把局部分页／地区进度当作总量。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "virtual_organizations": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "wam_disability_rep_done": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "workforce_disclosures": {
      "latest_related_run": {
        "task": "mhlw_positive_ryouritsu",
        "run_id": 25346,
        "started_at": "2026-10-02T21:20:00.807042+00:00",
        "finished_at": "2026-10-02T21:50:06.0115+00:00",
        "status": "timeout",
        "log_path": "/tyc-japan/tyc-japan/logs/scheduler/mhlw_positive_ryouritsu_20261002_212000.log",
        "log_file_matched": true,
        "programs": [
          "backend/crawlers/sources/mhlw_positive_ryouritsu.py"
        ],
        "source_codes": [
          "mhlw_positive_ryouritsu"
        ],
        "is_latest_task_run": true,
        "current_task_status": "timeout",
        "summary_line": null,
        "summary_kind": null,
        "structured_job_id": null,
        "table": "workforce_disclosures",
        "attribution": "unattributed",
        "counters": null,
        "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
      },
      "latest_attributable_run": null,
      "other_runs": [
        {
          "task": "mhlw_positive_ryouritsu",
          "run_id": 25346,
          "started_at": "2026-10-02T21:20:00.807042+00:00",
          "finished_at": "2026-10-02T21:50:06.0115+00:00",
          "status": "timeout",
          "log_path": "/tyc-japan/tyc-japan/logs/scheduler/mhlw_positive_ryouritsu_20261002_212000.log",
          "log_file_matched": true,
          "programs": [
            "backend/crawlers/sources/mhlw_positive_ryouritsu.py"
          ],
          "source_codes": [
            "mhlw_positive_ryouritsu"
          ],
          "is_latest_task_run": true,
          "current_task_status": "timeout",
          "summary_line": null,
          "summary_kind": null,
          "structured_job_id": null,
          "table": "workforce_disclosures",
          "attribution": "unattributed",
          "counters": null,
          "reason": "任务尚未完成或未成功；不把进度、默认零或失败前操作当作完整增量。"
        },
        {
          "task": "mhlw_positive_ryouritsu",
          "run_id": 19654,
          "started_at": "2026-09-02T21:20:00.261482+00:00",
          "finished_at": "2026-09-02T21:36:21.481224+00:00",
          "status": "success",
          "log_path": "scheduler_runs stdout_tail/stderr_tail",
          "log_file_matched": false,
          "programs": [
            "backend/crawlers/sources/mhlw_positive_ryouritsu.py"
          ],
          "source_codes": [
            "mhlw_positive_ryouritsu"
          ],
          "is_latest_task_run": false,
          "current_task_status": "timeout",
          "summary_line": "2026-09-02 21:36:21,049 INFO mhlw_positive_ryouritsu DONE {'parser_version': 'mhlw_positive_ryouritsu_v1', 'csv_name': '99_20260903_utf8.csv', 'csv_update_date': '2026-09-03', 'csv_fields': 236, 'records_parsed': 65159, 'certifications_parsed': 6320, 'awards_parsed': 270, 'deleted_workforce': 64620, 'deleted_certifications': 6230, 'deleted_awards': 271, 'inserted_workforce': 65159, 'inserted_certifications': 6320, 'inserted_awards': 270, 'no_match_corp': 12}",
          "summary_kind": "final_summary_line",
          "structured_job_id": 156577,
          "table": "workforce_disclosures",
          "attribution": "unattributed",
          "counters": null,
          "reason": "同一程序有多个业务输出表，汇总未逐表拆分，不能给每张表重复填入同一个数字。"
        }
      ],
      "coverage": "related_logs_without_table_counts",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    },
    "zoning_areas": {
      "latest_related_run": null,
      "latest_attributable_run": null,
      "other_runs": [],
      "coverage": "no_related_log_found",
      "note": "最近一次相关运行证据，不是当天合计、净增差分或全表所有写入方的总量。"
    }
  },
  "increment_metadata": {
    "checked_at": "2026-11-02T10:55:46.371327+00:00",
    "read_only": "on",
    "table_count": 165,
    "coverage_counts": {
      "has_reported_counts": 31,
      "related_logs_without_table_counts": 41,
      "no_related_log_found": 93
    },
    "readable_log_files": 166,
    "scheduler_task_count": 166,
    "note": "仅展示最近一次可取得的任务日志及计数；没有新增每日任务，没有按日汇总或推算全天增量。",
    "attribution_note": "单业务输出的计数是基于现有映射推定；多输出表未拆分时不复制指标。默认零、抓取量、部分地区进度和失败／运行中计数不作最终增量。"
  },
  "crawler_descriptions": {
    "backend/crawlers/sources/address_base_registry.py": {
      "summary": "下载并解析官方町字主数据 CSV 压缩包，将地址基准数据写入独立暂存表；不直接更新企业地址。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Digital Agency Address Base Registry machi-aza master -> address_base_aza.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 150,
          "symbol": "town_match_key",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 175,
          "symbol": "parse_zip_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 204,
          "symbol": "parse_http_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 213,
          "symbol": "upsert_file_manifest",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 272,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 341,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 107,
          "symbol": "clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 111,
          "symbol": "none_if_empty",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 116,
          "symbol": "kanji_number_to_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/address_base_registry.py",
          "line": 131,
          "symbol": "normalize_chome",
          "origin": "online"
        }
      ],
      "code_sha256": "9241e907f6facffe19b11bdd71389bcf7ee977321c52c296071c1fa0ca463689",
      "sources": [
        "address_base_registry_aza"
      ],
      "business_outputs": [
        "address_base_aza"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/anti_social_public.py": {
      "summary": "按来源分别解析行政执行、指定组织、通缉及其他公开风险资料，保存事实引用与来源证据；不直接判定企业为反社会势力。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Public anti-social / compliance watchlist crawlers.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 284,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 300,
          "symbol": "classify_enforcement",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 313,
          "symbol": "parse_no_trouble_links",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 349,
          "symbol": "parse_no_trouble_last_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 364,
          "symbol": "parse_no_trouble_form_data",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 383,
          "symbol": "parse_no_trouble_table_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 412,
          "symbol": "parse_no_trouble_csv_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 555,
          "symbol": "parse_npa_wanted_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 656,
          "symbol": "parse_prefectural_wanted_links",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/anti_social_public.py",
          "line": 682,
          "symbol": "parse_prefectural_wanted_page",
          "origin": "online"
        }
      ],
      "code_sha256": "73dee0b15857f27f90d72827712c8e1ff291523b30623f7aac2f140d11b914fe",
      "sources": [
        "caa_no_trouble",
        "fcg_incidents",
        "meti_foreign_user_list",
        "npa_designated_boryokudan",
        "npa_wanted",
        "pref_boryokudan_exclusion",
        "prefectural_police_wanted",
        "psia_terror_orgs",
        "shizuoka_boryokudan_public_notice",
        "yakuza_news",
        "yakuza_wiki"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/bengoshikai.py": {
      "summary": "读取律师检索 sitemap 和个人详情页，解析姓名、登记编号、所属及事务所信息；覆盖自愿登记者。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日弁連 ひまわりサーチ (弁護士検索) crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 117,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 247,
          "symbol": "parse_sitemap",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 300,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 510,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 274,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 278,
          "symbol": "_ensure_data_source",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/bengoshikai.py",
          "line": 474,
          "symbol": "_test_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "5dd19d1d358bc2874f1bd9c9004bba5c60e782ce0695f2fe267325b74818fc8d",
      "sources": [
        "bengoshikai"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/benrishi_navi.py": {
      "summary": "分页请求个人弁理士检索，抽取登记编号、姓名和事务所资料；代码尚未覆盖事务所独立检索模式。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日本弁理士会 公式検索 (弁理士ナビ) → professionals.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 139,
          "symbol": "parse_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 169,
          "symbol": "parse_total_count",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 200,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 242,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 258,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 131,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/benrishi_navi.py",
          "line": 362,
          "symbol": "_selftest",
          "origin": "online"
        }
      ],
      "code_sha256": "d485c4733087b2e1ce389f6008e501b4a8d529b6b352410fc0b2f45e8047c94e",
      "sources": [
        "benrishi_navi"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/caa_actions.py": {
      "summary": "遍历消费者厅年度公告和处分详情，抽取处分日期、对象及事件，并尝试关联法人编号。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "消費者庁 行政処分 (特商法 + 景表法) crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 54,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 71,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 85,
          "symbol": "classify",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 100,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 213,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_actions.py",
          "line": 64,
          "symbol": "text_only",
          "origin": "online"
        }
      ],
      "code_sha256": "c7133f014840ab3987040f8712c782902736b41403f922880f4557903fb97f31",
      "sources": [
        "caa_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/caa_recall.py": {
      "summary": "解析消费者厅召回列表，提取产品、企业与召回措施，按企业名尝试匹配法人。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "消費者庁 リコール情報サイト crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 41,
          "symbol": "parse_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 92,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 115,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/caa_recall.py",
          "line": 191,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "def2eadc40a57fa215e615c8a70b6dc9d992582a5f855c80918c709fdb46ea68",
      "sources": [
        "caa_recall"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/catr_kanpo.py": {
      "summary": "从首页和日期列表发现决算公告，解析公司、会计期间和财务指标，同时保留原始页面与规范化公告证据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "CatR 官報決算小批量 worker.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 266,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 281,
          "symbol": "parse_period_label",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 295,
          "symbol": "parse_amount_jpy",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 374,
          "symbol": "parse_home_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 408,
          "symbol": "parse_date_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 412,
          "symbol": "parse_list_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 416,
          "symbol": "parse_company_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 434,
          "symbol": "parse_summary_page_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 480,
          "symbol": "_parse_summary_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/catr_kanpo.py",
          "line": 549,
          "symbol": "_extract_links",
          "origin": "online"
        }
      ],
      "code_sha256": "e12c6aa6d689aed423e99f015b75a93d4f71ec6d5293b73748415d291350d938",
      "sources": [
        "catr_kanpo"
      ],
      "business_outputs": [
        "financial_statements",
        "kanpo_financial_facts",
        "kanpo_notice_entities",
        "kanpo_notices",
        "kanpo_source_records"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/construction_licenses.py": {
      "summary": "建立查询会话并读取建设业许可列表及详情，解析许可、代表人、地址、资本金与业务类别，按名称和地址匹配企业。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 建設業者 全国検索 → construction_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 132,
          "symbol": "extract_city",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 142,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 209,
          "symbol": "parse_list_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 241,
          "symbol": "classify_authority",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 280,
          "symbol": "parse_wareki_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 317,
          "symbol": "parse_validity_period",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 337,
          "symbol": "parse_detail_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 539,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 710,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/construction_licenses.py",
          "line": 993,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "e155da8ea6bf95797a410e0f9aef7253878b6bb2db4ca77152af825d8b1458eb",
      "sources": [
        "construction_licenses"
      ],
      "business_outputs": [
        "construction_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/courts_hanrei.py": {
      "summary": "抓取公开判例索引和详情中的案件元数据，保存案号、法院、裁判日期及 PDF 链接；此阶段不从正文识别企业当事人。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "裁判所判例検索 — 公開公的判決索引 (metadata-first crawler).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 126,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 138,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 204,
          "symbol": "fetch",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 246,
          "symbol": "insert_litigation",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 416,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 84,
          "symbol": "next_ua",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 96,
          "symbol": "throttle",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 122,
          "symbol": "_strip_tags",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 221,
          "symbol": "_ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/courts_hanrei.py",
          "line": 234,
          "symbol": "_already_have",
          "origin": "online"
        }
      ],
      "code_sha256": "cba1f2701ea9b4299fc3a56a7baf2ba7620e1df5aa038e55b57ac8dc649f7e62",
      "sources": [
        "courts_hanrei"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/crypto_exchange_fsa.py": {
      "summary": "重新解析金融厅加密资产交换业者 PDF，补充可扱取资产列表并合并已有许可记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "暗号資産交換業者一覧 enrichment (金融庁) — adds 取扱暗号資産 to business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 90,
          "symbol": "parse_assets",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 119,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 159,
          "symbol": "fetch_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 166,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 232,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/crypto_exchange_fsa.py",
          "line": 64,
          "symbol": "_to_date",
          "origin": "online"
        }
      ],
      "code_sha256": "ff40318ca1e8a52abaacb3a37496c398808e4e2562c07a82fa22ca93ac8e7247",
      "sources": [
        "crypto_exchange_fsa"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/daigaku_hatsu_vc.py": {
      "summary": "下载大学衍生创业企业 Excel，解析法人编号、关联大学、代表人、业务和经营属性并导入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "METI 大学発ベンチャーデータベース crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 111,
          "symbol": "parse_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 195,
          "symbol": "_fetch_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 253,
          "symbol": "upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 317,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 62,
          "symbol": "_norm",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 70,
          "symbol": "_to_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 82,
          "symbol": "_to_bigint",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 101,
          "symbol": "_clean_corp_number",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 132,
          "symbol": "cell",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/daigaku_hatsu_vc.py",
          "line": 249,
          "symbol": "ensure_table",
          "origin": "online"
        }
      ],
      "code_sha256": "8ca5746b52974d350db2cf91735a18bee5bc788efe141b8768faaad9c6895300",
      "sources": [
        "daigaku_hatsu_vc"
      ],
      "business_outputs": [
        "university_startups"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/data_go_jp_catalog.py": {
      "summary": "按关键词搜索 CKAN 开放数据目录，保存数据集与资源链接、命中词和粗分类，形成后续数据源发现队列。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "data.go.jp / e-Gov CKAN catalog discovery -> external_data_source_discoveries.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 94,
          "symbol": "parse_ts",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 104,
          "symbol": "classify_dataset",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 197,
          "symbol": "fetch_keyword",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 217,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 281,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 341,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 85,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 121,
          "symbol": "priority_for",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 130,
          "symbol": "resource_summary",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/data_go_jp_catalog.py",
          "line": 152,
          "symbol": "normalize_dataset",
          "origin": "online"
        }
      ],
      "code_sha256": "28d1c729130c16db1cfedc6f3f98dcd1a2284d909118a8057377ddbdc44d8f46",
      "sources": [
        "data_go_jp_catalog"
      ],
      "business_outputs": [
        "external_data_source_discoveries"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/diet.py": {
      "summary": "读取众议院分组名录和参议院名录，提取议员姓名、院别、政党及选区，保存政治人物资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国会議員一覧 crawler — 衆議院 + 参議院 (日本 PEP 数据库).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 48,
          "symbol": "parse_shugiin",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 82,
          "symbol": "parse_sangiin",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 132,
          "symbol": "insert_politicians",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 163,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 200,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 224,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/diet.py",
          "line": 41,
          "symbol": "normalize_name",
          "origin": "online"
        }
      ],
      "code_sha256": "e1c2198dda10563c833ef5ac5f0b201237a3e513c3a2e4fa141bb4a25288619f",
      "sources": [
        "diet_sangiin",
        "diet_shugiin"
      ],
      "business_outputs": [
        "politicians"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/dx_nintei.py": {
      "summary": "下载 DX 认定全量 CSV，解析法人编号、认定期间及企业属性，按认定记录写入资质数据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "dx_nintei — DX 認定事業者 (IPA / 経済産業省 / DX 推進ポータル).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 84,
          "symbol": "_parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 100,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 179,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/dx_nintei.py",
          "line": 228,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "9314b783cadf94ec0548164c5e2fb5a16f304ae8bced20716fca28fc92b5f5c6",
      "sources": [
        "dx_nintei"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/eco_action21.py": {
      "summary": "解析可取得的月度新增及历史认证 PDF，保存环境认证记录；不代表已完成网站全量名录抓取。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "エコアクション21 認証・登録事業者 一覧 (一般財団法人 持続性推進機構 IPSuS).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 159,
          "symbol": "parse_pdf_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 238,
          "symbol": "_parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 257,
          "symbol": "parse_total_count",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 262,
          "symbol": "parse_prefectures",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 288,
          "symbol": "fuzzy_match_corporate_number",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 323,
          "symbol": "insert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 396,
          "symbol": "fetch_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 405,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 379,
          "symbol": "probe_endpoint",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/eco_action21.py",
          "line": 502,
          "symbol": "_selftest",
          "origin": "online"
        }
      ],
      "code_sha256": "758890608fa954b8b06f22401b921f82931c2d94d3c79b8e3d8aae9725c3844a",
      "sources": [
        "eco_action21"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet.py": {
      "summary": "取得 EDINET 报告书 XBRL 压缩包，解析营业收入、利润、资产负债及现金等指标，补充企业财务报表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET 有価証券報告書 (年次/四半期) → financial_statements の D1-D5 補完.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 195,
          "symbol": "upsert_financial",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 281,
          "symbol": "extract_xbrl_facts",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 343,
          "symbol": "parse_fixture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 404,
          "symbol": "fetch_doc_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 555,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 674,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 100,
          "symbol": "map_to_financial_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 147,
          "symbol": "_i",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 153,
          "symbol": "_d",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet.py",
          "line": 394,
          "symbol": "_require_key",
          "origin": "online"
        }
      ],
      "code_sha256": "98d1b77261ab9b8af0d85ab288287d67fcc4eeb8f3a4193eccb25a77ba24ebd5",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "financial_statements"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet_business_purpose.py": {
      "summary": "从已登记的 EDINET 有价证券报告书中读取 XBRL 业务内容文本块，保存企业业务描述。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET 有価証券報告書 → company_business_purpose",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 94,
          "symbol": "extract_business_purpose",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 149,
          "symbol": "parse_fixture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 181,
          "symbol": "_upsert",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 254,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 67,
          "symbol": "_clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_business_purpose.py",
          "line": 194,
          "symbol": "process_one_doc",
          "origin": "online"
        }
      ],
      "code_sha256": "5886c1a294318a26fb5a61f44f057a9d305a8b627bb126f8755bdcf85003f197",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "company_business_purpose"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet_filings.py": {
      "summary": "调用 documents.json 登记披露文件元数据和文件标识，为后续 XBRL、股东及役员解析提供索引。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET v2 documents.json metadata → edinet_filings.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 77,
          "symbol": "fetch_day",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 87,
          "symbol": "upsert_filing",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 152,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 48,
          "symbol": "_flag",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 56,
          "symbol": "_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_filings.py",
          "line": 66,
          "symbol": "_ts",
          "origin": "online"
        }
      ],
      "code_sha256": "2b725fa16979b48cb28ae1549d378548e77d193ec9db3ee5516f6edba9256e00",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "edinet_filings"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet_officer_changes.py": {
      "summary": "解析役员异动临时报告书，用于补全役员离任等变更信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET 役員の異動 (臨時報告書 doc_type=180) → officers.resigned_at backfill.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 156,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 175,
          "symbol": "_extract_name_and_dob",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 219,
          "symbol": "_classify_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 245,
          "symbol": "parse_changes_block",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 336,
          "symbol": "extract_textblock_from_xbrl",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 367,
          "symbol": "fetch_doc_zip_type1",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 378,
          "symbol": "extract_xbrl_from_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 404,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 631,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officer_changes.py",
          "line": 787,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "8883417eb13349e7ef7651fafef8b6b5e99c9b0db6e7a8ff7851ac5cb4a64175",
      "sources": [
        "edinet_officer_changes"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet_officers.py": {
      "summary": "解析有价证券报告书的役员列表，抽取姓名、职务和履历，关联人员与企业任职记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET 役員一覧 (board of directors / executive officers / corporate auditors).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 117,
          "symbol": "_extract_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 143,
          "symbol": "_parse_birthdate",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 200,
          "symbol": "_parse_appointed_at",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 252,
          "symbol": "parse_officers",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 346,
          "symbol": "fetch_doc_zip_type1",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 357,
          "symbol": "extract_section_0104010",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 388,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 420,
          "symbol": "upsert_officer",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 577,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_officers.py",
          "line": 736,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "9e43ff54fb9f1dca7543314130c49a71f101eefb865aa35c98bc82f092ccd09f",
      "sources": [
        "edinet_officers"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/edinet_xbrl.py": {
      "summary": "深度解析 EDINET XBRL 财务指标并写入财务报表，与轻量文件索引程序分工。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "EDINET XBRL deep-parse → financial_statements.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/edinet_xbrl.py",
          "line": 44,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "7f1eb077f127624dece45f9943a1827f477cca6d27af26d795371963b66c34b1",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "financial_statements"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/egov_law.py": {
      "summary": "调用 e-Gov 法令 API，获取并解析法规条文及元数据，保存法令资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "e-Gov 法令検索 API → laws テーブル.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 51,
          "symbol": "upsert_law",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 114,
          "symbol": "fetch_law_type",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/egov_law.py",
          "line": 136,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "a77af846901c98b2fd24e7814ed885cf62b9c2070c30348d74d7a2e120b204f7",
      "sources": [
        "egov_law"
      ],
      "business_outputs": [
        "laws"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/enecho_power_generators.py": {
      "summary": "读取发电事业者公开名单，抽取企业名称、地址、电话和申报日期等登记资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "ANRE 発電事業届出: company/name, address, phone, notification date.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 25,
          "symbol": "parse_notification_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 35,
          "symbol": "parse_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 79,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/enecho_power_generators.py",
          "line": 59,
          "symbol": "write_records",
          "origin": "online"
        }
      ],
      "code_sha256": "df0aa3a7a1e3d9de276d849d489f91322e05b533581f589f88d926f2500199d6",
      "sources": [
        "enecho_power_generators"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/env_sanpai.py": {
      "summary": "解析产业废弃物处理经营者资料，保存许可和企业关联信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "産廃情報ネット (環境省) 産業廃棄物処理業者 → business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 50,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 62,
          "symbol": "parse_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 104,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 116,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/env_sanpai.py",
          "line": 94,
          "symbol": "normalize_corp_name",
          "origin": "online"
        }
      ],
      "code_sha256": "00407ad3fb1ba29d7e84339fc5bf1b24c30e7a65526bc5c32e2652ed838f5c16",
      "sources": [
        "env_sanpai"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/fben.py": {
      "summary": "按假名检索福冈县律师会列表并读取个人详情，解析姓名、登记编号、事务所和联系方式。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "福岡県弁護士会 (Fukuoka Bar Association) lawyer directory crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 135,
          "symbol": "parse_search_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 186,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 420,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 625,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 165,
          "symbol": "_strip_label",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 172,
          "symbol": "_split_name_kana",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 330,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 335,
          "symbol": "_ensure_data_source",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 357,
          "symbol": "_enumerate_detail_ids",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fben.py",
          "line": 577,
          "symbol": "_test_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "e899a5a31cde6bde87c290507112acbf901989eeecfac5cfc95008a61fb16c11",
      "sources": [
        "fben"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/foreign_enforcement.py": {
      "summary": "解析海外监管执法资料，筛选与日本企业有关的案件并尝试关联企业，保存公开监管事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "海外日企 enforcement crawler — 米欧監督機関の処分案件から日資企業を抽出.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 120,
          "symbol": "extract_company_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 142,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 217,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 239,
          "symbol": "parse_docket_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 258,
          "symbol": "parse_amount_usd",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 284,
          "symbol": "parse_rss",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 414,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 535,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 787,
          "symbol": "_is_identity_match",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/foreign_enforcement.py",
          "line": 811,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "3d101317cf34719472058ad87feab13f599d083d6ad9bd1c7b2de9f1987206a5",
      "sources": [
        "doj_fcpa",
        "eu_antitrust",
        "ofac_indirect",
        "sec_aaer",
        "uk_fca"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/freight_debt_watchlists.py": {
      "summary": "读取物流债务及黑名单类公开页面，筛选与日本相关的经营者并保存待核实风险线索。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Freight debt / blacklist watchlists filtered to Japan.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 168,
          "symbol": "_parse_decimal",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 177,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 215,
          "symbol": "parse_fdrs_warninglist",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 259,
          "symbol": "parse_jctrans_list_payload",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 293,
          "symbol": "parse_fdb_debtor_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 361,
          "symbol": "match_japan_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 396,
          "symbol": "_json_fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 533,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 699,
          "symbol": "_fetch_fdb_country_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/freight_debt_watchlists.py",
          "line": 712,
          "symbol": "_fetch_fdb_query",
          "origin": "online"
        }
      ],
      "code_sha256": "c15aaf426c3d5c3de5818732f8046cee38eeb71b50d3cc2c0b8e19b5b7613b19",
      "sources": [
        "freight_debt_watchlists"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/fsa.py": {
      "summary": "下载金融厅行政处分 Excel，解析处分对象、日期和内容，保存监管事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "金融庁 行政処分 crawler — Excel 全量版.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 82,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 103,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 205,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 34,
          "symbol": "corp_exists",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa.py",
          "line": 73,
          "symbol": "severity_of",
          "origin": "online"
        }
      ],
      "code_sha256": "281674c0d16ea09f9ff590af22f96870ad46d1eab49802d2438c4fc223e9e367",
      "sources": [
        "fsa_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/fsa_license_lists.py": {
      "summary": "按金融行业名单配置下载 Excel / XLS，解析经营者和许可登记资料，写入统一许可表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "FSA Excel/XLS license lists -> business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 99,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 124,
          "symbol": "fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 306,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 349,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 398,
          "symbol": "upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 517,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 78,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 87,
          "symbol": "normalize_digits",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 91,
          "symbol": "as_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_license_lists.py",
          "line": 135,
          "symbol": "resources",
          "origin": "online"
        }
      ],
      "code_sha256": "87719d04d91915702675c5c7dccce2650cd3aef5fcc1bceaa8b1264435848966",
      "sources": [
        "fsa_license_lists"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/fsa_registries.py": {
      "summary": "按来源解析金融厅 PDF 登记名录，统一保存金融业经营者及许可资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "FSA 系 PDF 登録一覧 → business_licenses (4 sources).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 107,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 140,
          "symbol": "fetch_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 147,
          "symbol": "upsert_license",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 183,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 67,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/fsa_registries.py",
          "line": 84,
          "symbol": "find_header_row",
          "origin": "online"
        }
      ],
      "code_sha256": "c9f7618004188300c16fe7590bbf91825a6d34f0bbdbb76b5741b90bbbf47ac4",
      "sources": [
        "crypto_registry",
        "fsa_registry",
        "loan_registry"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/gbizinfo.py": {
      "summary": "gBizINFO 早期基本资料采集实现，主要处理 target 00；完整八类接口由 gbizinfo_full 实现。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "gBizINFO crawler — 早期版 (target=00 のみ). 現在は gbizinfo_full.py が主流.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 43,
          "symbol": "fetch_target",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 60,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 136,
          "symbol": "run_for_corps",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 163,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 75,
          "symbol": "update_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo.py",
          "line": 125,
          "symbol": "enrich_one",
          "origin": "online"
        }
      ],
      "code_sha256": "0a16b1873e27f6bdb110ae19b56ffaff0a3651d9e4c4e51a50df298e414d89f0",
      "sources": [
        "gbizinfo"
      ],
      "business_outputs": [
        "companies",
        "company_aliases"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/gbizinfo_full.py": {
      "summary": "按 target 模式采集 gBizINFO 基本资料、补助、表彰、认定、采购、知识产权、财务和职场信息；实际输出受启动参数限制。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "gBizINFO 全 8 target crawler — 每家公司 8 类数据全部入库.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 66,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 232,
          "symbol": "_classify_award",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 603,
          "symbol": "fetch_target",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 662,
          "symbol": "run_for_corps",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 686,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 80,
          "symbol": "safe_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 88,
          "symbol": "safe_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 100,
          "symbol": "dept_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 110,
          "symbol": "write_target_00",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_full.py",
          "line": 155,
          "symbol": "write_target_01",
          "origin": "online"
        }
      ],
      "code_sha256": "6e957dab03c619046795f92355381cde6d55a76cfd048d32e58798dd723249b5",
      "sources": [
        "gbizinfo"
      ],
      "business_outputs": [
        "awards",
        "certifications",
        "companies",
        "company_aliases",
        "financial_statements",
        "government_contracts",
        "intellectual_properties",
        "workforce_disclosures"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/gbizinfo_html.py": {
      "summary": "读取 gBizINFO 法人详情 HTML，提取企业官网及其他档案线索，并保存原始文档。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "gBizINFO 法人プロフィール HTML scraper — extract website URL (and other fields).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 107,
          "symbol": "parse_profile_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 162,
          "symbol": "fetch_company_profile",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 272,
          "symbol": "dry_run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 335,
          "symbol": "main_cli",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 77,
          "symbol": "mark_done_lightweight",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 159,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 212,
          "symbol": "update_company_website",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gbizinfo_html.py",
          "line": 244,
          "symbol": "ensure_data_source",
          "origin": "online"
        }
      ],
      "code_sha256": "e9ff0ea1cb1576fe01e9099909496ec6a353569a4f57442747c5637dab266fea",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/geps.py": {
      "summary": "下载并解析政府采购落札开放数据，整理采购项目、成交供应商等资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "政府電子調達 (GEPS) 落札実績オープンデータ → government_contracts (type=bid_won).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 81,
          "symbol": "fetch_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 94,
          "symbol": "parse_zip_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 126,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 110,
          "symbol": "safe_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/geps.py",
          "line": 119,
          "symbol": "safe_date",
          "origin": "online"
        }
      ],
      "code_sha256": "bc03eaca43de5999f25f83d49ef909885d2fa76b1add142ee0c6b52c5ecc1928",
      "sources": [
        "geps"
      ],
      "business_outputs": [
        "government_contracts"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/government_procurement_suspensions.py": {
      "summary": "读取政府和自治体采购停止公告，提取企业、停止期间、事由及原公告链接，保存风险事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Government procurement suspensions/debarment -> risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 91,
          "symbol": "parse_japanese_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 114,
          "symbol": "parse_period_dates",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 169,
          "symbol": "fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 187,
          "symbol": "parse_digital",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 252,
          "symbol": "parse_osaka",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 342,
          "symbol": "parse_moj_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 388,
          "symbol": "parse_maff_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 445,
          "symbol": "parse_env_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 525,
          "symbol": "upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/government_procurement_suspensions.py",
          "line": 756,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "8a8fd7271af16c7cc1deed0f20d4c1cc776401e4ba95f71f8ae08281bb7debc2",
      "sources": [
        "government_procurement_suspensions"
      ],
      "business_outputs": [
        "government_procurement_suspensions",
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/gyoseishoshi.py": {
      "summary": "检索行政书士及相关法人，解析个人、事务所与登记资料，写入专业人员记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日本行政書士会連合会 会員検索 crawler (source_code=gyoseishoshi, source_id=33).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 120,
          "symbol": "parse_wareki",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 157,
          "symbol": "parse_list_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 241,
          "symbol": "parse_member_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 307,
          "symbol": "fetch_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 320,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 356,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 568,
          "symbol": "_sleep_remainder",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 575,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 801,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/gyoseishoshi.py",
          "line": 112,
          "symbol": "_clean",
          "origin": "online"
        }
      ],
      "code_sha256": "23910b8111d95617ce50d5f891ba56d728a9c5b5cbd9797f3dea5593f41f3f30",
      "sources": [
        "gyoseishoshi"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/hojyokin_portal.py": {
      "summary": "解析补助金门户的项目列表和详情，提取申请对象、期限及支援条件等项目资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "補助金ポータル -> subsidy_programs.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 128,
          "symbol": "_parse_date_bound",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 209,
          "symbol": "parse_application_period",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 218,
          "symbol": "parse_amount_jpy",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 236,
          "symbol": "extract_subsidy_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 248,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 284,
          "symbol": "parse_list_total_count",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 293,
          "symbol": "parse_detail_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 349,
          "symbol": "matches_end_date_window",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 366,
          "symbol": "fetch_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hojyokin_portal.py",
          "line": 516,
          "symbol": "fetch_detail",
          "origin": "online"
        }
      ],
      "code_sha256": "a13e0124c35eb51e7f3e2f3a173a37280db9a107d9c0e2ccd2f932cbcd5400a4",
      "sources": [
        "hojyokin_portal"
      ],
      "business_outputs": [
        "subsidy_programs"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/hotel_ryokan_intl.py": {
      "summary": "读取国际观光酒店及旅馆注册名单，提取设施、经营者和登记信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国際観光ホテル整備法に基づく登録ホテル・旅館一覧 (国交省 / 国際観光振興機構).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 89,
          "symbol": "fetch_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 115,
          "symbol": "_extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 123,
          "symbol": "parse_ryokan",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 163,
          "symbol": "parse_hotel",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 210,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 278,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 110,
          "symbol": "_decode_cp932",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 203,
          "symbol": "_strip_trade_prefix",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/hotel_ryokan_intl.py",
          "line": 272,
          "symbol": "ensure_table",
          "origin": "online"
        }
      ],
      "code_sha256": "a5847478aef4e5291cd7da65dc07667ccaa8e0eb7eebca8ecdcab21474edb74e",
      "sources": [
        "hotel_ryokan_intl"
      ],
      "business_outputs": [
        "hotel_ryokan_registry"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/industry_assoc.py": {
      "summary": "按协会配置读取行业会员处分公告，归一化公开处分事件；不同协会的解析和覆盖分别处理。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "業界自主規制 11 協会 会員処分公示 crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 76,
          "symbol": "parse_any_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 95,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 139,
          "symbol": "classify_action",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 173,
          "symbol": "parse_table_generic",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 213,
          "symbol": "parse_jsda",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 243,
          "symbol": "parse_jvcea",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 267,
          "symbol": "parse_seiho",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 272,
          "symbol": "parse_zenginkyo",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 443,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/industry_assoc.py",
          "line": 455,
          "symbol": "_run_one",
          "origin": "online"
        }
      ],
      "code_sha256": "f08efd5da4955ef680d119d5157623e95b9417fea9875be38ef9789e92a12ec9",
      "sources": [
        "jfsa_loan_actions",
        "jsda_actions",
        "jvcea_actions",
        "pcaj_actions",
        "retpc_actions",
        "seiho_actions",
        "sonpo_actions",
        "t2fifa_actions",
        "toushin_actions",
        "zenginkyo_actions",
        "zentaku_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/invoice_kohyo.py": {
      "summary": "适格请求书事业者的 CSV 采集实现；已有审查表明网络模式未完成且计划停用，不能当作当前 API 入口。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "invoice_kohyo — 適格請求書発行事業者公表 (国税庁) crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 115,
          "symbol": "parse_csv_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 125,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 135,
          "symbol": "_classify_kind",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 253,
          "symbol": "fetch_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 334,
          "symbol": "parse",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 406,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 150,
          "symbol": "_process_to_status",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 245,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 274,
          "symbol": "_iter_fixture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/invoice_kohyo.py",
          "line": 300,
          "symbol": "_hint_from_name",
          "origin": "online"
        }
      ],
      "code_sha256": "76b652cfceff57a34e131ba090228548b048d61287b36e04bfc7c477a98b282f",
      "sources": [
        "invoice_kohyo"
      ],
      "business_outputs": [
        "companies",
        "invoice_registrants"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/ipa_security_action.py": {
      "summary": "读取 SECURITY ACTION 自我宣言经营者列表，保存企业声明记录，保持与第三方认证的区别。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "IPA SECURITY ACTION self-declared organizations -> certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 125,
          "symbol": "parse_japanese_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 132,
          "symbol": "parse_pdf_links",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 213,
          "symbol": "parse_record_line",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 314,
          "symbol": "parse_pdf_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 344,
          "symbol": "fetch_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 426,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 523,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 92,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 98,
          "symbol": "handle_starttag",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ipa_security_action.py",
          "line": 107,
          "symbol": "handle_data",
          "origin": "online"
        }
      ],
      "code_sha256": "df6f29ac8536af7cb3269042639f34f261b4b34d4a6a062d5cf47363cddeeadc",
      "sources": [
        "ipa_security_action"
      ],
      "business_outputs": [
        "certifications",
        "ipa_security_action_declarations"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/isms_ac.py": {
      "summary": "解析 ISMS 获认证组织检索资料，保存企业与认证信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "ISMS-AC certified organizations -> certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 49,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 99,
          "symbol": "parse_index_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 123,
          "symbol": "parse_detail_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 185,
          "symbol": "fetch_index",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 191,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 197,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 221,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 295,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 45,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/isms_ac.py",
          "line": 60,
          "symbol": "__init__",
          "origin": "online"
        }
      ],
      "code_sha256": "72b22ccb909e8317ff0300dde413b98c283599772f1869ac996890859faf0d87",
      "sources": [
        "isms_ac_certified_orgs"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jaha_animal_hospitals.py": {
      "summary": "读取 JAHA 认证动物医院名单，提取医院与所在地等资料，保存设施相关资质记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "公益社団法人 日本動物病院協会 (JAHA) 認定病院一覧 → business_licenses (license_type='animal_hospital').",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 143,
          "symbol": "extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 151,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 204,
          "symbol": "parse_hospital_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 294,
          "symbol": "parse_sitemap",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 307,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 354,
          "symbol": "fetch_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 367,
          "symbol": "fetch_sitemap_urls",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 383,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 497,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jaha_animal_hospitals.py",
          "line": 119,
          "symbol": "normalize_corp_name",
          "origin": "online"
        }
      ],
      "code_sha256": "a013d4ff2cb99d981cc16456626e31b6b662b7127cadc5f724c5057f0e03aaf2",
      "sources": [
        "jaha_animal_hospitals"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jcia_cosmetics.py": {
      "summary": "读取化妆品工业会会员列表并匹配企业，保存会员资料；数据库使用许可类表承载，不等同于行政许可。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日本化粧品工業会 (JCIA) 会員企業一覧 → business_licenses (license_type='cosmetics_maker').",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 141,
          "symbol": "extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 149,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 193,
          "symbol": "parse_memberlist_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 250,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 293,
          "symbol": "fetch_member_type",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 315,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 411,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 117,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 137,
          "symbol": "candidate_normalized_forms",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jcia_cosmetics.py",
          "line": 374,
          "symbol": "_test_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "77a9e51fea1db05ea595dd31f995ff18c44562b3f2bc85e9027284df26dfab28",
      "sources": [
        "jcia_cosmetics"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jclp.py": {
      "summary": "读取 JCLP 加盟企业名单并关联企业，保存企业参与组织的信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "japan-clp.jp crawler — 日本気候リーダーズ・パートナーシップ 加盟企業.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 69,
          "symbol": "parse_organization_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 97,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 126,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 175,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jclp.py",
          "line": 92,
          "symbol": "_normalize",
          "origin": "online"
        }
      ],
      "code_sha256": "0eaaabee2a0b4d651ec1747186ffbdda699e97b2eb7a913f3088ea98f1c4f075",
      "sources": [
        "jclp"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jetro_case_studies.py": {
      "summary": "读取 JETRO 企业案例页面，提取案例与企业关联的业务内容，保存公开案例资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "JETRO public case studies.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 49,
          "symbol": "parse_month",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 121,
          "symbol": "main_area",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 178,
          "symbol": "parse_profile",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 227,
          "symbol": "parse_services",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 246,
          "symbol": "parse_body_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 260,
          "symbol": "parse_case",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 307,
          "symbol": "upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 361,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 38,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jetro_case_studies.py",
          "line": 45,
          "symbol": "clean_lines",
          "origin": "online"
        }
      ],
      "code_sha256": "c5ca6d876cf9899cf6e4ee0e5c8b85cd634840e57da7019a5d3f51f35976fae2",
      "sources": [
        "jetro_case_studies"
      ],
      "business_outputs": [
        "jetro_case_studies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jftc.py": {
      "summary": "解析公平交易委员会命令和课征金公告，提取案件对象及事件并关联企业。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "公正取引委員会 (JFTC) 排除措置命令 + 課徴金納付命令 crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 35,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 90,
          "symbol": "classify",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 104,
          "symbol": "extract_case_links",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 122,
          "symbol": "parse_case",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 198,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 280,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 72,
          "symbol": "wareki_to_iso",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc.py",
          "line": 80,
          "symbol": "text_only",
          "origin": "online"
        }
      ],
      "code_sha256": "ba08c9d1e4d1c95b9ead4c8bca575097eb5d39e8ac9498f71fa6fb587fdec476",
      "sources": [
        "jftc_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jftc_subcontract_recommendations.py": {
      "summary": "下载并解析下请法建议案件 Excel，保存企业、违法事项和建议事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "JFTC Subcontract Act recommendation Excel lists -> risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 97,
          "symbol": "parse_excel_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 138,
          "symbol": "parse_amount",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 173,
          "symbol": "fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 233,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 282,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 308,
          "symbol": "upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 473,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 78,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 87,
          "symbol": "to_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jftc_subcontract_recommendations.py",
          "line": 119,
          "symbol": "fiscal_year_from_label",
          "origin": "online"
        }
      ],
      "code_sha256": "26297bf13c3a991244338d92039f26e200f39d6ed7a30337c76db1e6bb60cb35",
      "sources": [
        "jftc_subcontract_recommendations"
      ],
      "business_outputs": [
        "jftc_subcontract_recommendations",
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jgoodtech_profiles.py": {
      "summary": "读取 J-GoodTech 公开企业档案，提取业务与企业简介内容供企业画像使用。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "J-GoodTech public company profiles.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 107,
          "symbol": "_extract_appeal_sections",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 131,
          "symbol": "_extract_products",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 244,
          "symbol": "_fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 319,
          "symbol": "_upsert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 412,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 51,
          "symbol": "_clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 58,
          "symbol": "_digits",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 67,
          "symbol": "_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 76,
          "symbol": "_boolish",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgoodtech_profiles.py",
          "line": 91,
          "symbol": "_keyword_names",
          "origin": "online"
        }
      ],
      "code_sha256": "369a734261a6db69b6b91737946d022d5a656bf478a7d61e15711e72d8622599",
      "sources": [
        "jgoodtech"
      ],
      "business_outputs": [
        "jgoodtech_company_profiles"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jgrants.py": {
      "summary": "调用 jGrants 补助金接口，读取项目列表与详情并写入补助项目。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "jGrants 補助金統一API → subsidy_programs テーブル.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 68,
          "symbol": "upsert_program",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 132,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 60,
          "symbol": "safe_dt",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jgrants.py",
          "line": 121,
          "symbol": "search_keyword",
          "origin": "online"
        }
      ],
      "code_sha256": "ce3eed8ac3767257799e8a49e1af86637143ebb8be3e761b0fcaf03f55a72859",
      "sources": [
        "jgrants"
      ],
      "business_outputs": [
        "subsidy_programs"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jicpa_registry.py": {
      "summary": "查询会计师及审计法人登记系统，解析登记身份、事务所和法人资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日本公認会計士協会 (JICPA) 公認会計士等検索システム crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 119,
          "symbol": "parse_search_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 156,
          "symbol": "parse_cpa_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 247,
          "symbol": "parse_audit_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 271,
          "symbol": "parse_audit_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 319,
          "symbol": "fetch_list_for_reg_code",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 335,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 371,
          "symbol": "upsert_cpa",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 400,
          "symbol": "upsert_audit_firm",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 629,
          "symbol": "_sleep_remainder",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jicpa_registry.py",
          "line": 759,
          "symbol": "run_parallel",
          "origin": "online"
        }
      ],
      "code_sha256": "ec98645ac38682ce55ab52a7685bac23607f25db7ddd87ea1561c0856c85e588",
      "sources": [
        "jicpa_registry"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jidosha.py": {
      "summary": "查询汽车运输经营者处分记录，按客运、货运等类别提取处分并关联企业。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 自動車事業者処分検索 — 卡车 / 客车 / 出租 / 货运 行政処分.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 44,
          "symbol": "parse_table",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 86,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 155,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jidosha.py",
          "line": 37,
          "symbol": "wareki_to_iso",
          "origin": "online"
        }
      ],
      "code_sha256": "6fc3c1825cbe5af1caf4ee923d5a1b9129dc20a80bfe4bd50f6aedc834de1cf7",
      "sources": [
        "mlit_jidosha"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jipdec_pmark.py": {
      "summary": "读取 PrivacyMark 获授予经营者检索结果，保存隐私标志相关企业认证信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "JIPDEC PrivacyMark certified organizations -> certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 40,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 96,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 108,
          "symbol": "upsert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 132,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 188,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jipdec_pmark.py",
          "line": 52,
          "symbol": "normalize_row",
          "origin": "online"
        }
      ],
      "code_sha256": "4b3b09797aaa3e4238c21181098f22182f30acf8828aa070b0a417ee22c366da",
      "sources": [
        "jipdec_pmark"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jnet21_support_programs.py": {
      "summary": "读取 J-Net21 支援信息，解析补助、融资等项目内容并归一化到支援项目表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "J-Net21 支援情報ヘッドライン -> subsidy_programs.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 130,
          "symbol": "parse_iso_datetime",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 142,
          "symbol": "parse_display_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 211,
          "symbol": "extract_application_period",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 243,
          "symbol": "parse_article_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 270,
          "symbol": "parse_rss",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 308,
          "symbol": "parse_institution_from_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 370,
          "symbol": "parse_detail_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 444,
          "symbol": "parse_results_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 485,
          "symbol": "upsert_program",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jnet21_support_programs.py",
          "line": 550,
          "symbol": "fetch_text",
          "origin": "online"
        }
      ],
      "code_sha256": "8351dbb18f28d5c87f6e8afaa6aeffb6cef3dad3cc301520177c208de8597afd",
      "sources": [
        "jnet21_support_programs"
      ],
      "business_outputs": [
        "subsidy_programs"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jpo_trademark_api.py": {
      "summary": "按已有商标记录调用知识产权接口，补充商标相关资料与状态。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Enrich trademark rows from JPO/J-PlatPat APIs.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 126,
          "symbol": "parse_jpo_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 158,
          "symbol": "result_remain",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 700,
          "symbol": "save_combined_raw",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 1257,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 1423,
          "symbol": "build_parser",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 1441,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 90,
          "symbol": "load_env",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 99,
          "symbol": "normalize_digits",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 106,
          "symbol": "normalize_application_no",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpo_trademark_api.py",
          "line": 117,
          "symbol": "normalize_registration_no",
          "origin": "online"
        }
      ],
      "code_sha256": "a755190ce6cb0e78480d8d68ad89d7b9de02a6fdcf00540ceb18c29dc61e0995",
      "sources": [
        "jpo_ip_api"
      ],
      "business_outputs": [
        "company_ip_profile",
        "intellectual_properties",
        "jpo_trademark_enrichment"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/jpx_listed.py": {
      "summary": "下载交易所上市公司 Excel，匹配企业并补充证券代码别名和匹配报告。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "JPX 上場会社一覧 (data_j.xls) → company_aliases (ticker) + matching report.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 48,
          "symbol": "_jpx_strip_for_match",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 63,
          "symbol": "fetch_xls",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 70,
          "symbol": "parse_xls",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 104,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 132,
          "symbol": "upsert_alias",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/jpx_listed.py",
          "line": 148,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "104f337d8f6ef0dbf713d4a09750a15438754bc45ef8b1a024225866da4a7910",
      "sources": [
        "jpx_listed"
      ],
      "business_outputs": [
        "companies",
        "company_aliases"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kaigo.py": {
      "summary": "读取介护事业所公开资料，提取运营主体、设施及服务信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "介護事業所 portal — 厚労省全国介護事業所一覧 crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 42,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo.py",
          "line": 160,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "86433581bf12b1cce83afff76bc8d05577a46e3d92af6261dd46169e2755ffe8",
      "sources": [
        "kaigo_jigyosho"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kaigo_facilities.py": {
      "summary": "下载介护服务开放数据，按设施解析服务、地址和法人信息，写入结构化设施表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "kaigo_facilities — 厚労省 介護サービス情報公表システム オープンデータ.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 72,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 197,
          "symbol": "upsert_facilities",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 291,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 140,
          "symbol": "_num",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaigo_facilities.py",
          "line": 277,
          "symbol": "find_csv_paths",
          "origin": "online"
        }
      ],
      "code_sha256": "1d45135806c397d1c8f4deb7c86c7eb3be73de3d2119b8e6ba1fb00209d575e5",
      "sources": [
        "kaigo_facilities"
      ],
      "business_outputs": [
        "care_facilities"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kaken_research_projects.py": {
      "summary": "检索 KAKEN 科研项目，提取课题、机构、研究者和研究内容等项目资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "KAKEN research project search.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 44,
          "symbol": "parse_iso_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 53,
          "symbol": "parse_period",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 62,
          "symbol": "parse_amount_thousand_yen",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 91,
          "symbol": "parse_total_count",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 97,
          "symbol": "parse_search_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 140,
          "symbol": "parse_pi_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 150,
          "symbol": "parse_detail_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 180,
          "symbol": "fetch_search_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 187,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kaken_research_projects.py",
          "line": 279,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "774261737468ddbcdbe9ca3c0e97bc4d74fa82104645a6fd49ce103233d629ad",
      "sources": [
        "kaken"
      ],
      "business_outputs": [
        "kaken_research_projects"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kanpo_official.py": {
      "summary": "发现官方官报期号、目录和 PDF，并结合 gov-book 目录线索写入统一官报分层；目录来源与官方正文来源分别保留。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Official Kanpo + gov-book TOC crawler for the unified kanpo_* layer.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 86,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 126,
          "symbol": "parse_official_home",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 164,
          "symbol": "parse_official_fullcontents",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 217,
          "symbol": "parse_gov_book_toc",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 246,
          "symbol": "classify_notice",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 301,
          "symbol": "fetch_home",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 305,
          "symbol": "fetch_fullcontents",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 309,
          "symbol": "fetch_govbook_toc",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 367,
          "symbol": "upsert_issue",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_official.py",
          "line": 398,
          "symbol": "upsert_notice",
          "origin": "online"
        }
      ],
      "code_sha256": "2e0bbdd6c6dd5824581d3206d43d278b0246ca312b1e57577934b74e8f80a21f",
      "sources": [
        "govbook_kanpo_index",
        "kanpo_official"
      ],
      "business_outputs": [
        "kanpo_issues",
        "kanpo_notices",
        "kanpo_source_records"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kanpo_tremolo.py": {
      "summary": "解析第三方官报决算公告，提取企业和会计期间的资产、负债及利润等公开财务数据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "kanpo.tremolo.work crawler — 官報決算公告聚合 (未上市公司財務).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 92,
          "symbol": "parse_index_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 118,
          "symbol": "parse_disclosure_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 192,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 214,
          "symbol": "insert_financial",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 274,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 74,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 86,
          "symbol": "_to_int_yen",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 179,
          "symbol": "total_liabilities",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 187,
          "symbol": "_normalize_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kanpo_tremolo.py",
          "line": 253,
          "symbol": "crawl_index",
          "origin": "online"
        }
      ],
      "code_sha256": "d71a8d554ee29c6d5f0b6a2c5128e65d1c50ac3842634ff8029d44529077310d",
      "sources": [
        "kanpo_tremolo"
      ],
      "business_outputs": [
        "financial_statements"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/keidanren_members.py": {
      "summary": "读取经团联会员名单，匹配企业并保存组织会员关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "経団連 (一般社団法人日本経済団体連合会) 会員一覧 → company_associations.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 113,
          "symbol": "parse_keidanren_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 157,
          "symbol": "fetch_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 175,
          "symbol": "insert_members",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 242,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 95,
          "symbol": "_looks_like_header",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/keidanren_members.py",
          "line": 99,
          "symbol": "_is_plausible_member_name",
          "origin": "online"
        }
      ],
      "code_sha256": "e400d2c5d7401f0fdb62567e1c6e91f87671e509dd659e5ebf6b818f9400b80a",
      "sources": [
        "keidanren_members"
      ],
      "business_outputs": [
        "company_associations"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kenko_keiei.py": {
      "summary": "解析健康经营优良法人公开名单，按企业和认定批次保存资质信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "kenko-keiei.jp crawler — 健康経営優良法人 認定法人一覧 (経産省 / 日本健康会議).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 133,
          "symbol": "parse_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 239,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 295,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 97,
          "symbol": "_find_header_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 106,
          "symbol": "_build_col_map",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kenko_keiei.py",
          "line": 285,
          "symbol": "find_xlsx_links",
          "origin": "online"
        }
      ],
      "code_sha256": "29fe45151173930b61108b2136458424069106ab2e3382f2279d21b8cde4a7ff",
      "sources": [
        "kenko_keiei"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/kkj_bid_notices.py": {
      "summary": "调用官公需检索 API，解析采购公告、发布机构和原文链接，保存招标机会。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "官公需情報ポータルサイト検索 API -> bid_notices.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 172,
          "symbol": "_parse_dt",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 185,
          "symbol": "_parse_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 250,
          "symbol": "parse_results_xml",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 406,
          "symbol": "upsert_notice",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 612,
          "symbol": "upsert_notices",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 693,
          "symbol": "fetch_segment",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 710,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 828,
          "symbol": "_parse_date_arg",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 845,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/kkj_bid_notices.py",
          "line": 80,
          "symbol": "date_param",
          "origin": "online"
        }
      ],
      "code_sha256": "796ea474e0dddb52538883e07b344c05e28fac2b23fd8213a004e4eb6d9406bc",
      "sources": [
        "kkj_bid_notices"
      ],
      "business_outputs": [
        "bid_notices"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/local_public_recognitions.py": {
      "summary": "按自治体来源读取表彰及获奖公告，提取企业与荣誉线索并保存证据，部分流程另镜像到奖项表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "地方自治体の表彰・受賞・顕彰公告 crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 1716,
          "symbol": "is_parseable_recognition_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 1944,
          "symbol": "main_content_root",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 1958,
          "symbol": "parse_jp_datetime",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 1999,
          "symbol": "extract_title",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2033,
          "symbol": "extract_published_at",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2166,
          "symbol": "extract_department",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2176,
          "symbol": "extract_award_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2309,
          "symbol": "extract_location_from_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2317,
          "symbol": "extract_labeled_location",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/local_public_recognitions.py",
          "line": 2928,
          "symbol": "is_pdf_narrative_company_match",
          "origin": "online"
        }
      ],
      "code_sha256": "eda94578f7d6a1ce962cf961af939871c9803810ce98889a44c4180b7e467331",
      "sources": [
        "local_public_recognitions"
      ],
      "business_outputs": [
        "awards",
        "local_public_recognitions",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/medical_facilities.py": {
      "summary": "下载医疗信息开放数据，解析医疗机构、设施功能和运营资料，写入医疗设施表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "medical_facilities — 厚労省 医療情報ネット (G-MIS) 全国オープンデータ.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 111,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 276,
          "symbol": "upsert_facilities",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 379,
          "symbol": "_extract_csv_from_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 390,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 193,
          "symbol": "_num",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 208,
          "symbol": "_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/medical_facilities.py",
          "line": 353,
          "symbol": "find_zip_paths",
          "origin": "online"
        }
      ],
      "code_sha256": "c718df6ecf3ab379781a67b96a6b362002672624119d6120801a1ea716d6c60d",
      "sources": [
        "medical_facilities"
      ],
      "business_outputs": [
        "medical_facilities"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/meti_bcp_keizokuryoku.py": {
      "summary": "读取事业持续力强化计划认定名单，解析企业与认定信息并保存。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "SME Agency business continuity reinforcement plan list -> certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 141,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 169,
          "symbol": "parse_period_end",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 222,
          "symbol": "parse_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 303,
          "symbol": "parse_reader_line",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 378,
          "symbol": "parse_renkei_period",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 447,
          "symbol": "parse_reader_renkei_markdown",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 544,
          "symbol": "parse_reader_markdown",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 583,
          "symbol": "fetch_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 596,
          "symbol": "fetch_reader_markdown",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/meti_bcp_keizokuryoku.py",
          "line": 706,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "15ebcac9ff9ae421ff755d49f083c73b2f5082f0b5c17c7a885db88fe361bcac",
      "sources": [
        "meti_bcp_keizokuryoku"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mhlw_actions.py": {
      "summary": "解析地方劳动局公开违法案件，抽取企业、公布日期和违法内容，保存劳动合规事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "厚労省 都道府県労働局 労働基準関係法令違反 公表事案 → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 281,
          "symbol": "parse_violation_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 379,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 144,
          "symbol": "reiwa_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 162,
          "symbol": "is_noise_title",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 178,
          "symbol": "looks_like_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 191,
          "symbol": "discover_pdf_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 228,
          "symbol": "cleantext",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 249,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 261,
          "symbol": "find_japanese_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_actions.py",
          "line": 533,
          "symbol": "_selftest_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "8f1b416aa9102cb710ae63ef45e9d2e77ab1145a6310302409d2d2fd297c75c9",
      "sources": [
        "mhlw_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mhlw_koyou_fraud.py": {
      "summary": "解析地方劳动局助成金不正领取公示，提取企业、事由及处理内容。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "厚労省 47 都道府県労働局 雇用関係助成金 不正受給 公表事案 → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 152,
          "symbol": "parse_amount_yen",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 166,
          "symbol": "_classify_header_cell",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 209,
          "symbol": "parse_koyou_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 364,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 101,
          "symbol": "reiwa_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 119,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 132,
          "symbol": "find_japanese_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 250,
          "symbol": "cell",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 285,
          "symbol": "_is_year_index_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_koyou_fraud.py",
          "line": 290,
          "symbol": "discover_pdfs",
          "origin": "online"
        }
      ],
      "code_sha256": "e5f3a28538159430cc406936c40dc548383661f31e891eb80b8485f51bcbaa3b",
      "sources": [
        "mhlw_koyou_fraud"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mhlw_positive_ryouritsu.py": {
      "summary": "读取女性活跃推进开放数据，解析职场披露及相关认定和表彰，分别写入对应业务表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "MHLW 女性の活躍推進企業DB open data -> workforce/certifications/awards.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 75,
          "symbol": "parse_update_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 108,
          "symbol": "parse_zip_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 279,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 351,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 66,
          "symbol": "clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 70,
          "symbol": "normalize_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 85,
          "symbol": "download_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 122,
          "symbol": "build_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 188,
          "symbol": "existing_companies",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mhlw_positive_ryouritsu.py",
          "line": 201,
          "symbol": "write_all",
          "origin": "online"
        }
      ],
      "code_sha256": "eefb838e29ad77d6a90b98c3ab6e32534ac6a10ee9f6c228be8ddb39e47d3e26",
      "sources": [
        "mhlw_positive_ryouritsu"
      ],
      "business_outputs": [
        "awards",
        "certifications",
        "workforce_disclosures"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mlit.py": {
      "summary": "读取国土交通省负面信息，归一化其主管行业企业处分事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 ネガティブ情報等検索 crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 72,
          "symbol": "parse_results",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 146,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit.py",
          "line": 242,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "3734a2ffb83dbf8216b0761a5ebfd98e3898dd6ad8375d053f6674598c4121a8",
      "sources": [
        "mlit_negative"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mlit_negative_extended.py": {
      "summary": "扩展读取国土交通省负面信息中的多个行业类别，解析行政处分并关联企业。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 ネガティブ情報等検索サイト — extended crawler (all 業種).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 122,
          "symbol": "_classify_shobun",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 130,
          "symbol": "parse_nega_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 275,
          "symbol": "parse_ryokou_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 388,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 630,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 118,
          "symbol": "_strip_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 249,
          "symbol": "has_next_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 255,
          "symbol": "_excel_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 345,
          "symbol": "already_have",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mlit_negative_extended.py",
          "line": 354,
          "symbol": "fuzzy_resolve_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "3f080c815cbff6ffb40d0ae795b75e3aa78adac581f913ba1bb16eca31c50513",
      "sources": [
        "mlit_negative"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/mof_sanctions.py": {
      "summary": "下载财务省资产冻结制裁名单，解析对象身份、别名和措施等信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "財務省 経済制裁 (資産凍結) 対象者リスト → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 92,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 46,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 58,
          "symbol": "_valid_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 66,
          "symbol": "find_csv_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/mof_sanctions.py",
          "line": 78,
          "symbol": "find_japanese_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "b22427b3d4aee18aa1d8dd20a05e36fdc3fb6faf37877caaa6fea3a461628261",
      "sources": [
        "mofa_sanctions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/moj_e_koukoku.py": {
      "summary": "读取电子公告系统当前公开窗口，发现公告企业和公告线索，保存可追溯的公告记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "法務省電子公告システム current-window notice crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 107,
          "symbol": "parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 117,
          "symbol": "parse_source_updated_label",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 144,
          "symbol": "parse_data_js",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 195,
          "symbol": "fetch_url",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 216,
          "symbol": "extract_pdf_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 246,
          "symbol": "extract_html_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 259,
          "symbol": "extract_document_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 280,
          "symbol": "extract_urls",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 305,
          "symbol": "classify_notice_type",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/moj_e_koukoku.py",
          "line": 327,
          "symbol": "parse_notice_document_fields",
          "origin": "online"
        }
      ],
      "code_sha256": "852c860319e8db995b3e4e64457deb6221098905a02c742b0050e50c696a5856",
      "sources": [
        "moj_e_koukoku"
      ],
      "business_outputs": [
        "moj_e_koukoku_notice_documents",
        "moj_e_koukoku_notices"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/nadeshiko_kenko_meigara.py": {
      "summary": "解析女性活跃及健康经营相关上市公司年度入选名单，按来源区分保存认定或入选记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "なでしこ銘柄 + 健康経営銘柄 (経産省 + TSE 共同 上場会社選定) → certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 163,
          "symbol": "parse_nadeshiko_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 260,
          "symbol": "parse_next_nadeshiko_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 320,
          "symbol": "parse_kenko_meigara_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 450,
          "symbol": "fetch_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 513,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 580,
          "symbol": "_run_one_scheme",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 665,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 107,
          "symbol": "jp_era_to_west_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 148,
          "symbol": "_norm_cell",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nadeshiko_kenko_meigara.py",
          "line": 154,
          "symbol": "_is_mark",
          "origin": "online"
        }
      ],
      "code_sha256": "867ccafa937b5d3b2864c560443bcc3bccb8431658b9756064cdc41a586b9d04",
      "sources": [
        "kenko_keiei_meigara",
        "nadeshiko_meigara"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/niigata_bengo.py": {
      "summary": "按假名读取新潟县律师会名录表格，解析律师和事务所资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "新潟県弁護士会 (Niigata Bar Association) lawyer roster crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 134,
          "symbol": "parse_kana_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 239,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 439,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 173,
          "symbol": "_td_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 213,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 217,
          "symbol": "_ensure_data_source",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/niigata_bengo.py",
          "line": 389,
          "symbol": "_test_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "786dd2a7511f01bf821fcfb06021af2586599341105b1dd60074638ca47668f9",
      "sources": [
        "niigata_bengo"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/nintei_shien_kikan.py": {
      "summary": "检索认定经营革新支援机构，解析机构基本信息及公开服务资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "SME Agency certified management innovation support institutions.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 140,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 161,
          "symbol": "fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 192,
          "symbol": "extract_view_state",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 235,
          "symbol": "parse_result_range",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 243,
          "symbol": "parse_record_id",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 250,
          "symbol": "parse_search_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 298,
          "symbol": "parse_search_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 312,
          "symbol": "fetch_initial_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 321,
          "symbol": "fetch_next_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nintei_shien_kikan.py",
          "line": 486,
          "symbol": "parse_detail",
          "origin": "online"
        }
      ],
      "code_sha256": "875fe119f10ccdbde663e977926bf5151d2177a6a82dd1f41a2ba531bb6e8a89",
      "sources": [
        "nintei_shien_kikan"
      ],
      "business_outputs": [
        "certifications",
        "nintei_shien_kikan_records"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/nite_jiko.py": {
      "summary": "解析产品事故周报，提取产品、经营者和事故内容，保存产品安全事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "NITE 製品事故情報 (週報) → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 115,
          "symbol": "parse_remarks",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 253,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 327,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 74,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 88,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 95,
          "symbol": "_join_line",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 101,
          "symbol": "_normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 159,
          "symbol": "find_japanese_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 188,
          "symbol": "_severity_and_subcategory",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/nite_jiko.py",
          "line": 207,
          "symbol": "discover_pdfs",
          "origin": "online"
        }
      ],
      "code_sha256": "52f23e2876e8b5c6518017698d6f20555d5483f81778c421465089b87f8215da",
      "sources": [
        "nite_jiko"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/npo.py": {
      "summary": "下载全国 NPO 法人数据，解析法人基本资料及相关属性。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "NPO 法人 portal — 内閣府 NPO 全国一括ダウンロード.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 57,
          "symbol": "fuzzy_match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 73,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo.py",
          "line": 177,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "342c9ff754881339d9d1e8ef7d5bf03585c93ca0eafd872c6da38c7578f5bc22",
      "sources": [
        "npo_houjin"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/npo_facilities.py": {
      "summary": "读取 NPO 门户批量数据，保存独立结构化 NPO 法人资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "NPO 法人ポータルサイト (内閣府) — `npo_facilities` 構造化テーブル版.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 195,
          "symbol": "parse_csv_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 293,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 353,
          "symbol": "fetch_shard",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 374,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 119,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 127,
          "symbol": "_intish",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 141,
          "symbol": "_bs_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 172,
          "symbol": "decode_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 270,
          "symbol": "fuzzy_corporate_number",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/npo_facilities.py",
          "line": 492,
          "symbol": "_selftest",
          "origin": "online"
        }
      ],
      "code_sha256": "b3ab669187885d75a8506a32fc02065b533dbce699efae3c6c49f311b95f0665",
      "sources": [
        "npo_houjin"
      ],
      "business_outputs": [
        "npo_facilities"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/osakaben.py": {
      "summary": "通过大阪律师会的检索、确认、结果及详情流程读取会员资料，按 EUC-JP 编解码处理姓名和事务所信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "大阪弁護士会 (Osaka Bar Association) lawyer directory crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 186,
          "symbol": "parse_count_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 197,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 212,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 495,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 721,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 142,
          "symbol": "_encode_form",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 149,
          "symbol": "_decode",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 153,
          "symbol": "_strip_label",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 159,
          "symbol": "_split_name_kana",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/osakaben.py",
          "line": 173,
          "symbol": "_norm_zip",
          "origin": "online"
        }
      ],
      "code_sha256": "d356b18407f7e12905889c6cef3aa2f43104c3c7bc24069d5bedfc2e4962c54b",
      "sources": [
        "osakaben"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/partnership_declaration.py": {
      "summary": "读取企业伙伴关系宣言资料，解析企业与声明信息并保存。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "partnership_declaration — パートナーシップ構築宣言 (中小企業庁 / 全国中小企業振興機関協会).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 131,
          "symbol": "parse_api_response",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 149,
          "symbol": "parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 178,
          "symbol": "parse_pdf_metadata",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 243,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 288,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 366,
          "symbol": "fetch_pref",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 394,
          "symbol": "maybe_fetch_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 421,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 232,
          "symbol": "_strip_legal_form",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/partnership_declaration.py",
          "line": 383,
          "symbol": "get_initial_revision",
          "origin": "online"
        }
      ],
      "code_sha256": "6b8ac6f4959aa9b8b5152749289040c7d2a5fb9c5c8d60c2cdcdb21f5bdf8fb9",
      "sources": [
        "partnership_declaration"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/pmda_recall.py": {
      "summary": "读取医药品及医疗器械回收 CSV，整理回收产品、企业、等级及事件信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "PMDA 医薬品/医療機器 回収情報 CSV → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 75,
          "symbol": "parse_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 83,
          "symbol": "extract_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 114,
          "symbol": "fetch_zip",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 123,
          "symbol": "parse_zip_csvs",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 137,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 58,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 68,
          "symbol": "clean_cell",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/pmda_recall.py",
          "line": 100,
          "symbol": "find_japanese_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "062e2ea76df28993272be8a3fde1eb8a9fdc06e5100dc0e75b9a4e31c4c6972a",
      "sources": [
        "pmda_recall"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/ppc_actions.py": {
      "summary": "读取个人信息保护委员会公告，解析相关企业与监管措施。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "個人情報保護委員会 (PPC) 行政指導/勧告/命令 → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 67,
          "symbol": "classify",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 77,
          "symbol": "extract_corps",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 103,
          "symbol": "parse_year_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 129,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 58,
          "symbol": "reiwa_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/ppc_actions.py",
          "line": 87,
          "symbol": "find_japanese_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "9efce8a85db140005c250ad85df591d3c754dc93ca8ab4b21516005aaccf8359",
      "sources": [
        "ppc_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/prtimes.py": {
      "summary": "读取企业新闻稿列表和详情，保存标题、日期、正文与企业关联；部分写入采用删除后重写。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "prtimes.jp crawler — プレスリリース全文公開 (未上市公司新闻唯一正规来源).",
      "evidence": [
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 72,
          "symbol": "parse_sitemap_news",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 117,
          "symbol": "parse_release_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 167,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 195,
          "symbol": "insert_news",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 257,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 100,
          "symbol": "_to_aware_dt",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 162,
          "symbol": "_normalize_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 225,
          "symbol": "crawl_sitemap",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/prtimes.py",
          "line": 248,
          "symbol": "crawl_release",
          "origin": "online"
        }
      ],
      "code_sha256": "4e157a7db399159edd00419a27a7c635b0eb8ec942c24dcee784f310974410f7",
      "sources": [
        "prtimes"
      ],
      "business_outputs": [
        "news_mentions"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/real_estate_appraisers.py": {
      "summary": "解析不动产鉴定业者公开名簿，保存经营者及登记信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 不動産鑑定業者名簿 → business_licenses (license_type='real_estate_appraiser').",
      "evidence": [
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 118,
          "symbol": "extract_city",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 128,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 251,
          "symbol": "parse_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 298,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 320,
          "symbol": "insert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 410,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 91,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 109,
          "symbol": "candidate_normalized_forms",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 213,
          "symbol": "_floatify_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/real_estate_appraisers.py",
          "line": 230,
          "symbol": "_str",
          "origin": "online"
        }
      ],
      "code_sha256": "84c2e6ac9134bc9887cbdf2f3bef091b5a90aa97f4e003d6e7a399c22fd112b8",
      "sources": [
        "real_estate_appraisers"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/reinfolib.py": {
      "summary": "按不动产接口类型解析交易价格及地理空间数据，保存供所在地分析使用的结构化数据；不同接口分工不同。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "不動産情報ライブラリ (国土交通省) — 35 endpoints の正規 parser.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 140,
          "symbol": "_fetch_json",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 155,
          "symbol": "_parse_int_with_unit",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 169,
          "symbol": "_parse_float_with_unit",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 183,
          "symbol": "_parse_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 208,
          "symbol": "_parse_building_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 286,
          "symbol": "_save_raw_snapshot",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 316,
          "symbol": "_mark_snapshot_parsed",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 338,
          "symbol": "run_xit001",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 476,
          "symbol": "run_xit002",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/reinfolib.py",
          "line": 524,
          "symbol": "run_xct001",
          "origin": "online"
        }
      ],
      "code_sha256": "2c0c70b8e46ec606c02febdf88f8e48cba3fcc56e6c4f0ad6bd82ca696a20635",
      "sources": [
        "reinfolib"
      ],
      "business_outputs": [
        "appraisal_reports",
        "gis_facility_points",
        "gis_zone_polygons",
        "land_prices",
        "municipalities_lookup",
        "population_mesh_250m",
        "real_estate_transactions",
        "station_passengers",
        "zoning_areas"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/sanctions.py": {
      "summary": "分别读取美国、联合国、欧盟和英国制裁名单，归一化主体、别名与识别资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国際制裁名单 crawler — 4 大制裁リスト.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 51,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 159,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 244,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 386,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sanctions.py",
          "line": 483,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "9aec0122146e8304c388734e47357cd3befc7eb317e6de7434d46350b95f9798",
      "sources": [
        "eu_sanctions",
        "ofac_sdn",
        "uk_sanctions",
        "un_sanctions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/satsuben.py": {
      "summary": "按假名遍历札幌律师会名录与个人页面，解析专业人员及事务所资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "札幌弁護士会 (Sapporo Bar Association) — 弁護士検索システム crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 138,
          "symbol": "parse_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 181,
          "symbol": "parse_profile",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 308,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 547,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 130,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 283,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 287,
          "symbol": "_ensure_data_source",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/satsuben.py",
          "line": 483,
          "symbol": "_test_fixtures",
          "origin": "online"
        }
      ],
      "code_sha256": "3b6cddd92c339cfe7fa744a316c84a667b5a363e7a57da2c1229956fb078de73",
      "sources": [
        "satsuben"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/sbt_certified.py": {
      "summary": "读取 SBT 企业数据文件，筛选日本企业并保存气候目标相关状态。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "SBT (Science Based Targets) 認定企業 — 日本企業のみ抽出.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 147,
          "symbol": "parse_companies",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 209,
          "symbol": "parse_targets",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 406,
          "symbol": "insert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 466,
          "symbol": "fetch_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 481,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 99,
          "symbol": "_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 121,
          "symbol": "_to_year",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 133,
          "symbol": "_norm_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 255,
          "symbol": "build_cert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sbt_certified.py",
          "line": 375,
          "symbol": "build_name_index",
          "origin": "online"
        }
      ],
      "code_sha256": "28edfd4be2d63e4a52a59c99c72e9f269a4a18a5eb929bac207e4293c050cf41",
      "sources": [
        "sbt_certified"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/school_institution.py": {
      "summary": "下载学校代码名录，解析学校类型、名称、代码及所在地等资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "文部科学省 学校コード (国公私立 大学/短大/高専/高校/中学/小学/専修 等 全国一覧) → school_institution.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 116,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 142,
          "symbol": "_extract_city",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 154,
          "symbol": "parse_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 217,
          "symbol": "fetch_csv",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 224,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 271,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/school_institution.py",
          "line": 105,
          "symbol": "_split_code_label",
          "origin": "online"
        }
      ],
      "code_sha256": "94631811cb6975efc6ada2d7542edd3e7dbbb3b4d0d13e1cd570f7df9971a574",
      "sources": [
        "school_institution"
      ],
      "business_outputs": [
        "school_institution"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/sec_20f.py": {
      "summary": "读取 SEC 中日本企业相关披露，识别美国上市或 ADR 等跨境上市关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "SEC EDGAR — 米国上場 / ADR 日本企業 (Form 20-F) → cross_listings.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 118,
          "symbol": "fetch_json",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 182,
          "symbol": "fetch_submission",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 206,
          "symbol": "fuzzy_match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 236,
          "symbol": "fuzzy_match_corp_by_ticker",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 249,
          "symbol": "upsert_listing",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 367,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 113,
          "symbol": "_normalize_sec_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 127,
          "symbol": "list_japan_20f_ciks",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 188,
          "symbol": "latest_20f_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sec_20f.py",
          "line": 300,
          "symbol": "enrich_from_submission",
          "origin": "online"
        }
      ],
      "code_sha256": "9439ab70dd7709140c3f2495a1a503e83ed75cb8e86957290d5e1146be0b5d67",
      "sources": [
        "sec_20f"
      ],
      "business_outputs": [
        "cross_listings"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/security_companies.py": {
      "summary": "解析地方警察公开的警备业认证 PDF 名单，保存经营者及认定记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "警備業認定業者一覧 (都道府県公安委員会 公開 PDF) → business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 141,
          "symbol": "extract_city",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 151,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 221,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 326,
          "symbol": "fetch_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 437,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 113,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 133,
          "symbol": "candidate_normalized_forms",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 208,
          "symbol": "_is_header_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 213,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/security_companies.py",
          "line": 339,
          "symbol": "crawl_one_pref",
          "origin": "online"
        }
      ],
      "code_sha256": "d84b97f8e4f8494148697cb909d4938ed789576971d3668f5043fe6125631e30",
      "sources": [
        "security_companies"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/seiji_shikin.py": {
      "summary": "发现政治资金收支报告及文件链接，保存政治团体和报告索引。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "政治資金収支報告書 (Political Funds Reports) → political_organization_reports.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 129,
          "symbol": "parse_title",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 178,
          "symbol": "parse_org_detail_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 260,
          "symbol": "parse_alpha_listing_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 296,
          "symbol": "parse_root_index",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 368,
          "symbol": "upsert_report",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 398,
          "symbol": "fetch",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 618,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 122,
          "symbol": "reiwa_year_to_ad",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 169,
          "symbol": "decode",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin.py",
          "line": 408,
          "symbol": "discover_reports",
          "origin": "online"
        }
      ],
      "code_sha256": "1ef9cde0741e52acc2a6436be98c7e77c7b18626764377c8b1f647f5fb10a708",
      "sources": [
        "seiji_shikin"
      ],
      "business_outputs": [
        "political_organization_reports"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/seiji_shikin_donors.py": {
      "summary": "对政治资金报告 PDF 进行文本提取或 OCR，解析捐款相关资料并保存。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "政治資金収支報告書 Phase 2 — PDF OCR → political_donations.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 99,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 106,
          "symbol": "_parse_wareki",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 156,
          "symbol": "parse_ocr_pages_donations",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 235,
          "symbol": "fetch_pdf_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 241,
          "symbol": "insert_donations",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 328,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 72,
          "symbol": "_clean_amount",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 114,
          "symbol": "_find_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 129,
          "symbol": "_detect_donor_kind",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seiji_shikin_donors.py",
          "line": 278,
          "symbol": "process_one_report",
          "origin": "online"
        }
      ],
      "code_sha256": "e823c51cc5e1e10725e8978fc9266fbc15b7154e13957940c2f919e663aafce5",
      "sources": [
        "seiji_shikin"
      ],
      "business_outputs": [
        "political_donations",
        "political_organization_reports"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/seikei_bankruptcies.py": {
      "summary": "解析公开的不渡和破产报道，提取企业、程序及事件日期，保存风险线索。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Seikei Data dishonor / bankruptcy notices.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 101,
          "symbol": "_parse_int",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 111,
          "symbol": "_parse_debt_jpy",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 157,
          "symbol": "parse_month_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 348,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 406,
          "symbol": "amain",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 428,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 61,
          "symbol": "category",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 68,
          "symbol": "subcategory",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 81,
          "symbol": "severity",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/seikei_bankruptcies.py",
          "line": 94,
          "symbol": "_clean_text",
          "origin": "online"
        }
      ],
      "code_sha256": "1a3e532e043331b9f6e2901cd79da139c1b6594042cc14c4b5323178a8bea5f4",
      "sources": [
        "seikei_bankruptcies"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/sesc_actions.py": {
      "summary": "解析证券交易监管课征金建议公告，提取企业及事件资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "証券取引等監視委員会 課徴金勧告 → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 73,
          "symbol": "classify",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 79,
          "symbol": "extract_corps",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 92,
          "symbol": "parse_year_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 149,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 66,
          "symbol": "reiwa_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/sesc_actions.py",
          "line": 121,
          "symbol": "find_japanese_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "030ea05e28b8803939b2e9a87b58c6229146c64b930c06389c2a70fa40185021",
      "sources": [
        "sesc_actions"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/shihoshoshi.py": {
      "summary": "读取司法书士检索结果及详情，保存专业人员和事务所资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "日本司法書士会連合会 司法書士検索システム crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 151,
          "symbol": "parse_member_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 310,
          "symbol": "fetch_member_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 346,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 516,
          "symbol": "_sleep_remainder",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 525,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 659,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 135,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 274,
          "symbol": "synth_reg_no",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 297,
          "symbol": "make_client",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shihoshoshi.py",
          "line": 396,
          "symbol": "as_dict",
          "origin": "online"
        }
      ],
      "code_sha256": "3b2c7485fde2983e81cc1e54825ddcefe97347e1cb190e5219859fa9f6d5932f",
      "sources": [
        "shihoshoshi"
      ],
      "business_outputs": [
        "professionals"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/shokuhin_eisei.py": {
      "summary": "读取食品营业许可及申报资料，解析经营设施、经营者及许可信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "食品衛生申請等システム (FOOd / 食品営業許可・届出) → food_business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 149,
          "symbol": "parse_date_jp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 305,
          "symbol": "parse_csv_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 316,
          "symbol": "parse_xlsx_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 335,
          "symbol": "parse_xls_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 350,
          "symbol": "parse_resource",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 388,
          "symbol": "insert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 511,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 73,
          "symbol": "search_bodik_datasets",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 98,
          "symbol": "pick_best_resource",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shokuhin_eisei.py",
          "line": 128,
          "symbol": "_decode",
          "origin": "online"
        }
      ],
      "code_sha256": "bdd6716d50b876ae0acef39dbc6c1b0f604128685d0b6226282ac5c7b80f3bac",
      "sources": [
        "shokuhin_eisei"
      ],
      "business_outputs": [
        "food_business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/shougai_fukushi.py": {
      "summary": "下载 WAM 障碍福祉开放数据，解析服务设施、地址和运营法人，写入设施表。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "WAM 障害福祉サービス等情報公表システム オープンデータ → disability_welfare_facilities.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 148,
          "symbol": "parse_csv_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 267,
          "symbol": "parse_zip_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 283,
          "symbol": "insert_records",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 369,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 137,
          "symbol": "_clean",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/shougai_fukushi.py",
          "line": 357,
          "symbol": "find_latest_period",
          "origin": "online"
        }
      ],
      "code_sha256": "932f35e41cb0962d5c2eed9c6ddade77483c0ce6af5f92d6de1fd731aa0ea5e8",
      "sources": [
        "shougai_fukushi"
      ],
      "business_outputs": [
        "disability_welfare_facilities"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/smart_sme_supporter.py": {
      "summary": "检索获认定 IT 支援机构，提取企业与认定资料并保存。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Smart SME Supporter certified IT support agencies -> certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 87,
          "symbol": "extract_view_state",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 95,
          "symbol": "fetch_result",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 122,
          "symbol": "parse_search_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 175,
          "symbol": "parse_services",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 199,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 255,
          "symbol": "fetch_initial_search",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 264,
          "symbol": "fetch_next_search",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 374,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 451,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/smart_sme_supporter.py",
          "line": 55,
          "symbol": "clean_text",
          "origin": "online"
        }
      ],
      "code_sha256": "13dba1268775be67e2857ab447273e91ddbc8f85da4c3d5b2fe76772236543af",
      "sources": [
        "smart_sme_supporter"
      ],
      "business_outputs": [
        "certifications",
        "smart_sme_supporters"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/takken_registry.py": {
      "summary": "建立查询会话并解析宅建等经营者检索结果，提取许可、经营者与所在地，并按名称和地址匹配法人。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国交省 建設業者・宅建業者等 業者総括検索 → business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 108,
          "symbol": "extract_city",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 118,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 182,
          "symbol": "parse_results_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 305,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 72,
          "symbol": "normalize_corp_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 96,
          "symbol": "candidate_normalized_forms",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 216,
          "symbol": "map_industry",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/takken_registry.py",
          "line": 225,
          "symbol": "crawl_prefecture",
          "origin": "online"
        }
      ],
      "code_sha256": "12aa2e266211f05f320f2036a945f7d610545f7a1d438c561e335b2eaac0914b",
      "sources": [
        "takken_registry"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/tcfd_supporters.py": {
      "summary": "解析 TCFD 支持企业名单并匹配法人，保存框架支持关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "TCFD 賛同企業・機関 (METI 経済産業省) crawler.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 114,
          "symbol": "parse_supporters_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 236,
          "symbol": "parse_group_counts",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 272,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 312,
          "symbol": "insert_certifications",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 382,
          "symbol": "_fetch_html",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 400,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 176,
          "symbol": "_collect_text_until_next_header",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 214,
          "symbol": "_split_names",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 246,
          "symbol": "_normalize_name",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tcfd_supporters.py",
          "line": 265,
          "symbol": "_strip_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "56acc88b11f180afa73dd82b3b25925eb0d14c45d281d2bff113c48da79587cf",
      "sources": [
        "tcfd_supporters"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/tdb_bankruptcy_flash.py": {
      "summary": "解析帝国数据库破产速报，提取企业与公开破产事项，保存可追溯风险事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "TDB bankruptcy flash notices.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 90,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 95,
          "symbol": "_parse_debt_jpy",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 128,
          "symbol": "_extract_body",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 165,
          "symbol": "parse_loader_payload",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 272,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 358,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 366,
          "symbol": "_run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 68,
          "symbol": "subcategory",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 83,
          "symbol": "_clean_text",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdb_bankruptcy_flash.py",
          "line": 121,
          "symbol": "_html_to_text",
          "origin": "online"
        }
      ],
      "code_sha256": "3afdf0914ccfee95b692935aded5eb9b7ded792963bde9da8cf4096bb66a5b32",
      "sources": [
        "tdb_bankruptcy_flash"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/tdnet.py": {
      "summary": "读取上市公司适时披露列表，保存公告标题、日期、附件链接及企业关联。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "TDnet 適時開示 crawler — 上場企業の毎日の開示情報.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 79,
          "symbol": "classify_title",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 86,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 156,
          "symbol": "insert_news",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 200,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 323,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tdnet.py",
          "line": 149,
          "symbol": "lookup_corp_by_ticker",
          "origin": "online"
        }
      ],
      "code_sha256": "535212d5252fe9ac2b2696865e34b31e679c26e3348d675b5d10e8fcfec01328",
      "sources": [
        "tdnet"
      ],
      "business_outputs": [
        "news_mentions",
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/temp_staffing_and_job_placement.py": {
      "summary": "分别读取劳务派遣和收费职业介绍经营者登记，解析事业所及许可资料并保存。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "厚労省 人材サービス総合サイト\n   → 労働者派遣事業 (temp_staffing) + 有料職業紹介事業 (job_placement)",
      "evidence": [
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 65,
          "symbol": "save_raw_document",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 161,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 209,
          "symbol": "parse_wareki",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 237,
          "symbol": "extract_form_state",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 282,
          "symbol": "parse_results_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 345,
          "symbol": "fetch_pref_page1",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 368,
          "symbol": "fetch_pref_page_n",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 403,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 502,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/temp_staffing_and_job_placement.py",
          "line": 62,
          "symbol": "lookup_source_id",
          "origin": "online"
        }
      ],
      "code_sha256": "65411030ecb07294adf957f8633fa343dac0febe7ce113c18c2534904983fc83",
      "sources": [
        "job_placement_registry",
        "temp_staffing_registry"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/travel_agencies.py": {
      "summary": "解析观光厅及地方旅行经营者名录，按登记类别保存企业和许可资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "旅行業者・旅行業者代理業・旅行サービス手配業 登録名簿 → business_licenses.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 215,
          "symbol": "extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 223,
          "symbol": "match_corp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 275,
          "symbol": "parse_wareki",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 322,
          "symbol": "parse_kankocho_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 361,
          "symbol": "parse_hyogo_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 399,
          "symbol": "parse_shizuoka_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 486,
          "symbol": "parse_osaka_xlsx",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 553,
          "symbol": "upsert_row",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 605,
          "symbol": "fetch_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/travel_agencies.py",
          "line": 782,
          "symbol": "run",
          "origin": "online"
        }
      ],
      "code_sha256": "fd9525614a86d6b901cb33f3d9d114654a17974be515ca46b8a47eed25d22436",
      "sources": [
        "travel_agencies"
      ],
      "business_outputs": [
        "business_licenses"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/tsr_bankruptcy.py": {
      "summary": "通过公开 RSS 和详情页发现破产速报，抽取企业和破产相关事项并尝试关联法人。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "TSR (Tokyo Shoko Research) 倒産速報 — 公開 RSS + 詳細 HTML.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 109,
          "symbol": "parse_rss",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 134,
          "symbol": "_parse_kanji_amount",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 161,
          "symbol": "_parse_jp_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 188,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 304,
          "symbol": "_fuzzy_match_corp_from_title",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 376,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 402,
          "symbol": "_fetch_rss_items",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 409,
          "symbol": "_fetch_sitemap_items",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 505,
          "symbol": "amain",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/tsr_bankruptcy.py",
          "line": 513,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "4bef7cf825b5095e3e9a7f136a48652ac58fa0fc172c1d69953c67bb1806b383",
      "sources": [
        "tsr_bankruptcy"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/virtual_office_operators.py": {
      "summary": "读取多个虚拟办公室及共享办公运营商的网点列表，提取地址、网点名及运营商。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "virtual_office_operators — 日本主要虚拟办公室 / 共享办公运营商の location 一覧.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 125,
          "symbol": "parse_jp_address",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 253,
          "symbol": "_extract_regus_location_links",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 269,
          "symbol": "_parse_regus_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 323,
          "symbol": "fetch_regus_locations",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 379,
          "symbol": "_parse_servcorp_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 441,
          "symbol": "fetch_servcorp_locations",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 475,
          "symbol": "_parse_crosscoop_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 514,
          "symbol": "fetch_crosscoop_locations",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 563,
          "symbol": "upsert",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/virtual_office_operators.py",
          "line": 672,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "4b8a2009d436ed151906e4d03117fa9270a6aea41d8002dfb653830ddca5976f",
      "sources": [
        "virtual_office_operators"
      ],
      "business_outputs": [
        "virtual_office_locations"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/wikidata_houjin.py": {
      "summary": "通过 SPARQL 按法人编号取得 Wikidata 实体与相关属性，补充企业外部知识标识。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Wikidata 法人番号 LOD → company_wikidata enrichment.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 135,
          "symbol": "fetch_sparql_bulk",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 183,
          "symbol": "parse_sparql_bindings",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 254,
          "symbol": "fetch_wikipedia_summary",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 327,
          "symbol": "upsert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 349,
          "symbol": "run_fixture_test",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 388,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 495,
          "symbol": "run_smoke_50",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 118,
          "symbol": "_sparql",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 145,
          "symbol": "_val",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/wikidata_houjin.py",
          "line": 153,
          "symbol": "_qid_from_uri",
          "origin": "online"
        }
      ],
      "code_sha256": "ee479082e8e3e10c5e6f4574e400791815f02744345be57c3dd8e280fb52da70",
      "sources": [
        "wikidata_houjin"
      ],
      "business_outputs": [
        "company_wikidata"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/yakkyoku_registry.py": {
      "summary": "解析各自治体药局许可数据，统一设施、地址及许可字段。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "薬局 開設許可 全国 一覧 → pharmacy_registry.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 110,
          "symbol": "parse_date_jp",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 369,
          "symbol": "parse_csv_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 378,
          "symbol": "parse_xlsx_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 396,
          "symbol": "parse_xls_bytes",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 411,
          "symbol": "parse_resource",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 456,
          "symbol": "insert_rows",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 679,
          "symbol": "run_fixtures",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 729,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 89,
          "symbol": "_decode",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/yakkyoku_registry.py",
          "line": 157,
          "symbol": "_norm_corp_no",
          "origin": "online"
        }
      ],
      "code_sha256": "91a8b19eacfd1c2fdbdf2f58b595d4ffdd9fe23f27bf8b965cc9d68df8ee40fe",
      "sources": [
        "yakkyoku_registry"
      ],
      "business_outputs": [
        "pharmacy_registry"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/youth_yell.py": {
      "summary": "解析 Youth Yell 认定企业资料，保存认证及招聘 URL 等线索；不等于职位明细采集。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "ユースエール認定企業 (厚労省 若者雇用促進総合サイト) → company_certifications.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 149,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 161,
          "symbol": "_extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 171,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 216,
          "symbol": "parse_detail_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 307,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 380,
          "symbol": "upsert_record",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 488,
          "symbol": "fetch_list",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 494,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 506,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/youth_yell.py",
          "line": 139,
          "symbol": "_clean",
          "origin": "online"
        }
      ],
      "code_sha256": "44bc8355123609bdd3ddeb9cd2522970e7c2bea4d45ce32bc7c4c7ac05d93bfa",
      "sources": [
        "youth_yell"
      ],
      "business_outputs": [
        "certifications"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/crawlers/sources/zeirishi_chokai.py": {
      "summary": "读取税理士惩戒公示，解析处分主体、内容和日期，保存专业人员相关风险事件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "国税庁 税理士・税理士法人 懲戒処分 → risk_events.",
      "evidence": [
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 67,
          "symbol": "parse_zeirishi_pdf",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 114,
          "symbol": "parse_html_chokai_page",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 193,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 53,
          "symbol": "reiwa_to_date",
          "origin": "online"
        },
        {
          "file": "backend/crawlers/sources/zeirishi_chokai.py",
          "line": 156,
          "symbol": "discover_pdf_urls",
          "origin": "online"
        }
      ],
      "code_sha256": "d52459f2f4b6223834b19536094047154124c7d8e1bf45c553dfd5420ec48eb0",
      "sources": [
        "nta_taino",
        "zeirishi",
        "zeirishi_chokai"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/quality/checks.py": {
      "summary": "对重复、字段空值、法人关联覆盖、增长异常和采集陈旧等情况运行质量检查，写入质量指标。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "数据质量检查 — 全表扫描产出 metrics 入库.",
      "evidence": [
        {
          "file": "backend/quality/checks.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 531,
          "symbol": "run_all_checks",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 578,
          "symbol": "save_metrics",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 92,
          "symbol": "severity",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 121,
          "symbol": "check_dup_rate",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 176,
          "symbol": "check_coverage_pct",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 200,
          "symbol": "check_risk_events_coverage_filtered",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 250,
          "symbol": "check_null_rate",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 281,
          "symbol": "_expected_interval_hours",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 310,
          "symbol": "_load_schedule_intervals",
          "origin": "online"
        },
        {
          "file": "backend/quality/checks.py",
          "line": 331,
          "symbol": "check_crawler_stale",
          "origin": "online"
        }
      ],
      "code_sha256": "3e2b24a5a71e553833bf0fb001f7c2cdf02010f41dad17109f94ff9c4b0758ed",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_business_purpose_from_website.py": {
      "summary": "复用企业官网已保存的业务描述，补全业务内容表，并标记为官网证据以区别 EDINET 披露。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill company_business_purpose from company-owned website evidence.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_business_purpose_from_website.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_business_purpose_from_website.py",
          "line": 66,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "8ffe5663624d2c9862c14898e09b8e279983d4dd119a1ede0eac46f4a98dfba2",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_court_case_intelligence.py": {
      "summary": "复用已解析判决 PDF 的结构化记录，生成案件事实、法官和企业关联等索引，避免重复下载文书。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill structured court case facts from existing hanrei PDF parses.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 159,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 33,
          "symbol": "db_conn",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 37,
          "symbol": "select_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 67,
          "symbol": "backfill_row",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_court_case_intelligence.py",
          "line": 188,
          "symbol": "process_rows",
          "origin": "online"
        }
      ],
      "code_sha256": "d980d0122fbfb2ec7d393fc203b9e6225c32688a271abccb44016fa93bfbb7e0",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_en_name_from_edinet.py": {
      "summary": "从已有 EDINET XBRL 文档中提取英文企业名称，仅对 companies 中缺失的 en_name 补写并记录来源。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill `companies.en_name` from EDINET 有価証券報告書 XBRL.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 185,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 85,
          "symbol": "_normalize_en_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 94,
          "symbol": "_decode_csv",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 106,
          "symbol": "find_english_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 143,
          "symbol": "select_listed_no_en_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_en_name_from_edinet.py",
          "line": 298,
          "symbol": "print_samples",
          "origin": "online"
        }
      ],
      "code_sha256": "55ccc888a5e1f18482cdb0e335852b92e7044557bfd831a807e93f3920d3ff8b",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_establishment_from_edinet.py": {
      "summary": "从有价证券报告书的沿革文本块识别公司设立日期，按语义锚点提取并补全企业成立时间。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill `companies.establishment_date` from EDINET 有価証券報告書 XBRL.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 122,
          "symbol": "_parse_date_match",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 144,
          "symbol": "extract_establishment",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 315,
          "symbol": "select_max_fetched_at",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 341,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 137,
          "symbol": "_date_before",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 212,
          "symbol": "find_history_textblock",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 243,
          "symbol": "read_watermark",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 255,
          "symbol": "write_watermark",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 261,
          "symbol": "select_latest_yuho_per_corp",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_edinet.py",
          "line": 478,
          "symbol": "print_samples",
          "origin": "online"
        }
      ],
      "code_sha256": "54191bde2a22ab418a4c884e806e2b6ea705fe52cd20574f1edb6d85240b5523",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_establishment_from_website.py": {
      "summary": "将企业官网采集的自由文本成立日期标准化；不确定月份或日期使用约定占位，需保留精度边界。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Stream B: Normalize company_website_data.founded_date_raw → establishment_date.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_establishment_from_website.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_website.py",
          "line": 49,
          "symbol": "parse_founded_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_website.py",
          "line": 91,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_establishment_from_website.py",
          "line": 42,
          "symbol": "_normalize_text",
          "origin": "online"
        }
      ],
      "code_sha256": "e80b6370b56d1fa23661ecfd5661a6c5c2382a570d182becc06c26ba5242a2f0",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_geps_representatives.py": {
      "summary": "读取 GEPS 公开企业详情，解析代表人姓名并补入 persons、officers，使用 geps_representative_done 保存处理状态。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill representatives from GEPS public business detail pages.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 82,
          "symbol": "parse_table_fields",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 96,
          "symbol": "parse_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 147,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 363,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 392,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 440,
          "symbol": "parse_years",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 454,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 69,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 75,
          "symbol": "csrf_token",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_geps_representatives.py",
          "line": 112,
          "symbol": "corporation_class",
          "origin": "online"
        }
      ],
      "code_sha256": "ddabb5f8202b8ca4a5ffb90ac6685df1a9dfdbe8e8122b0bffab4b1506a4c6a2",
      "sources": [
        "geps"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_industry_from_env_sanpai.py": {
      "summary": "依据产业废弃物处理许可，将相关企业的行业信号合并到推断行业数据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "env_sanpai (産業廃棄物処理業 許可) → company_industry_inferred 增量聚合.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_industry_from_env_sanpai.py",
          "line": 127,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "57b23a9f2db81a02059c46185ac571b38ada090535f1e972ad976544eda92938",
      "sources": [
        "env_sanpai"
      ],
      "business_outputs": [
        "company_industry_inferred"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_kanpo_insolvency_risk_events.py": {
      "summary": "将官报破产相关目录或公告页转为风险证据并登记下游关联；未识别债务人时仅保留页级推断，不能当作企业破产事实。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill Kanpo insolvency notice pages into risk_events.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 50,
          "symbol": "classify_kanpo_risk_kind",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 84,
          "symbol": "build_body_extracted",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 209,
          "symbol": "insert_downstream_link",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 251,
          "symbol": "parse_date_arg",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 257,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 317,
          "symbol": "parse_args",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 333,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 42,
          "symbol": "iso",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 59,
          "symbol": "best_source_url",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_kanpo_insolvency_risk_events.py",
          "line": 72,
          "symbol": "build_body",
          "origin": "online"
        }
      ],
      "code_sha256": "db4295d76b339d16b5f85a44334584b82601523685b89be154822418cce2be91",
      "sources": [
        "kanpo_official"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_new_source_company_matches.py": {
      "summary": "将已采集的新来源记录与 companies、company_aliases 做保守企业匹配，回填匹配结果或风险／认证关联。各来源有独立分支，不能把所有输入来源与所有输出表交叉连接；默认试运行，需 --apply 才写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Conservatively attach newly crawled public-source rows to companies.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 83,
          "symbol": "extract_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 592,
          "symbol": "apply_match",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 709,
          "symbol": "match_evidence_json",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 724,
          "symbol": "apply_certification_matches_bulk",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 759,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 67,
          "symbol": "norm_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 71,
          "symbol": "as_dict",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 92,
          "symbol": "clean_jetro_company_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 104,
          "symbol": "cert_name_from_meta",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_new_source_company_matches.py",
          "line": 116,
          "symbol": "iter_jetro",
          "origin": "online"
        }
      ],
      "code_sha256": "0258e8c0ff76d3376d32048f66756e8807ba5f0b4294b0b0427584c7b4c99f53",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_officers_from_gbizinfo_html.py": {
      "summary": "通过已存原始文档指针读取 gBizINFO HTML，解析代表人并补全人员及任职关系，不重新请求源站。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Phase A backfill: parse raw_documents source_id=112 (gbizinfo_html) → officers.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 63,
          "symbol": "fetch_raw_batch",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 92,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 117,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 143,
          "symbol": "mark_raw_parsed",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 159,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 272,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 56,
          "symbol": "s3",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_gbizinfo_html.py",
          "line": 154,
          "symbol": "company_exists",
          "origin": "online"
        }
      ],
      "code_sha256": "69ac7b12ccdeec5be6f520eca595289d074a2ba8a8fa31f03831ebbeb82b9d55",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_officers_from_public_reps.py": {
      "summary": "复用认证、大学创业企业及旅行许可中较可靠的代表人字段，清洗姓名并补全人员和任职关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill conservative representative officers from structured public fields.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 196,
          "symbol": "parse_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 233,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 281,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 320,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 356,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 394,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_public_reps.py",
          "line": 224,
          "symbol": "role_tier",
          "origin": "online"
        }
      ],
      "code_sha256": "c93aa47d520e9abf683d2b938a2015fec56b2af10d46efce0a3a85c571a2beec",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_officers_from_website.py": {
      "summary": "读取已采集的企业官网资料，解析代表人姓名并补入 persons、officers，保留官网来源和任职层级；不将其等同于商业登记证明。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill representative officers from company_website_data.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 131,
          "symbol": "parse_single_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 145,
          "symbol": "parse_representatives",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 187,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 208,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 238,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 257,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 303,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 69,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 93,
          "symbol": "normalize_name_part",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_officers_from_website.py",
          "line": 118,
          "symbol": "split_role_blocks",
          "origin": "online"
        }
      ],
      "code_sha256": "656a408082dc853e35a7a09cd46c8a7fa6f3e663fc12b086590102c1a7a00980",
      "sources": [
        "company_website_data"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_partnership_declaration_reps.py": {
      "summary": "下载伙伴关系宣言 PDF，提取代表人式签署人并保存证据；签署人线索与商事登记代表人区分。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill representative-like signatories from Partnership Declaration PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 207,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 324,
          "symbol": "parse_pdf_result",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 347,
          "symbol": "parse_ocr_text_result",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 371,
          "symbol": "parse_ocr_variants_arg",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 504,
          "symbol": "parse_ocr_consensus_result",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 567,
          "symbol": "fetch_all",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 581,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 611,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 886,
          "symbol": "fetch_current_api_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_partnership_declaration_reps.py",
          "line": 1057,
          "symbol": "fetch_ocr_candidates",
          "origin": "online"
        }
      ],
      "code_sha256": "ce367edd330e88c83ca0cfd1a3c576f9852cb5c53e803cfae1c1ab128f3a66b0",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_political_donation_corporate_numbers.py": {
      "summary": "清洗政治献金原始名称，保守匹配企业并回填 political_donations 的法人编号；默认试运行，对歧义或低置信结果只报告。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill corporate numbers on political donation rows.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 2,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 244,
          "symbol": "extract_company_phrases_from_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 270,
          "symbol": "extract_company_phrases",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 537,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 599,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 183,
          "symbol": "load_env",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 197,
          "symbol": "normalize_width",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 204,
          "symbol": "normalize_company_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 211,
          "symbol": "legal_form_of",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 216,
          "symbol": "company_body",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_political_donation_corporate_numbers.py",
          "line": 220,
          "symbol": "name_variants",
          "origin": "online"
        }
      ],
      "code_sha256": "bdaa4a5cdefbbaaf5175673008fbd8bef0dbf863f41cb17c6ecada274c0239ce",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/backfill_representative.py": {
      "summary": "调用 gBizINFO 法人 API 取得代表人字段，拆分姓名和职务，补全人员及企业任职记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Backfill 代表者 (legal representative) into persons + officers tables.",
      "evidence": [
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 103,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 213,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 247,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 318,
          "symbol": "fetch_corp",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 333,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 518,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 89,
          "symbol": "_is_role_token",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 205,
          "symbol": "has_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 267,
          "symbol": "ensure_done_table",
          "origin": "online"
        },
        {
          "file": "backend/scripts/backfill_representative.py",
          "line": 291,
          "symbol": "mark_done",
          "origin": "online"
        }
      ],
      "code_sha256": "6f7bea37269c0fc0b80bb9c60ac149bee1f8837360f9a0cc93b27e38c8d4c67b",
      "sources": [
        "gbizinfo"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/build_address_clusters.py": {
      "summary": "在同一町丁目番地内结合规范楼名、房号与虚拟办公室证据聚类地址，生成企业地址簇。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "同 chome-banchi 内基于多证据规则把 building 字符串聚类。",
      "evidence": [
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 141,
          "symbol": "extract_room",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 302,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 61,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 64,
          "symbol": "find",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 76,
          "symbol": "union",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 81,
          "symbol": "groups",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 100,
          "symbol": "canonical_street",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 113,
          "symbol": "name_without_room",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 118,
          "symbol": "longest_common_substring_len",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_address_clusters.py",
          "line": 136,
          "symbol": "is_room_only",
          "origin": "online"
        }
      ],
      "code_sha256": "030c8b0a9258b94faec4323a2855dc7618a20a18852f4e7b9c192b68382e2334",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/build_business_model_v2.py": {
      "summary": "聚合已有业务证据并计算 B2B、B2C 得分，生成控股、B2B、B2C、混合或未知业务模式及置信度。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Build company_business_model v2 — fix the 2026-05-13 broken classifier.",
      "evidence": [
        {
          "file": "backend/scripts/build_business_model_v2.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v2.py",
          "line": 158,
          "symbol": "classify_one",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v2.py",
          "line": 278,
          "symbol": "run_shard",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v2.py",
          "line": 355,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v2.py",
          "line": 335,
          "symbol": "smoke_test",
          "origin": "online"
        }
      ],
      "code_sha256": "d1b45a51283e4488ab0685dbff8266321d4d8a210f0f94ccd0a345e94016a483",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/build_business_model_v3.py": {
      "summary": "在业务模式分类中加入推断行业、官网业务文本和扩充关键词信号，保存分类、得分与来源信号。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Build company_business_model v3 — adds JSIC + website + expanded keyword signals.",
      "evidence": [
        {
          "file": "backend/scripts/build_business_model_v3.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v3.py",
          "line": 275,
          "symbol": "classify_one",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v3.py",
          "line": 418,
          "symbol": "run_shard",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v3.py",
          "line": 511,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_model_v3.py",
          "line": 492,
          "symbol": "smoke_test",
          "origin": "online"
        }
      ],
      "code_sha256": "71c45e1bd7c92763fb3128384287c5c77ac3238a444cf0954fe126f27aed025e",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/build_business_scope.py": {
      "summary": "汇总许可、设施、职业及业务文本，形成业务范围证据台账，并聚合为 JSIC 中分类行业信号。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Build company_business_scope evidence ledger + aggregate to company_industry_inferred.industry_jsic_mid.",
      "evidence": [
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 311,
          "symbol": "match_jsic_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 321,
          "symbol": "extract_codes_from_freetext",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 923,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 334,
          "symbol": "stable_source_row_id",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 364,
          "symbol": "_exec_many",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 373,
          "symbol": "populate_construction",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 408,
          "symbol": "populate_simple_permit_table",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 438,
          "symbol": "populate_business_licenses",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 488,
          "symbol": "populate_professionals",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_business_scope.py",
          "line": 509,
          "symbol": "populate_certifications",
          "origin": "online"
        }
      ],
      "code_sha256": "7e45b52c6de714102c4b1748c4c084c270e0d7cb56f7cae35f7a578894c1f038",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/build_virtual_orgs.py": {
      "summary": "按专业人士的事务所名称、职业类别和都道府县聚合 virtual_organizations，并为符合条件且尚未关联的 professionals 回填组织ID；这是人员／事务所聚合，不直接证明工商集团关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "build_virtual_orgs.py — 由 professionals 重建 virtual_organizations 聚合表 (D1-D5 SAFE 版)",
      "evidence": [
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 167,
          "symbol": "extract_pref_city",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 286,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 385,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 451,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 138,
          "symbol": "strip_name_suffix",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 152,
          "symbol": "normalize_office_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 161,
          "symbol": "strip_postcode",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 208,
          "symbol": "load_city_to_pref",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 237,
          "symbol": "_self_audit",
          "origin": "online"
        },
        {
          "file": "backend/scripts/build_virtual_orgs.py",
          "line": 324,
          "symbol": "aggregate",
          "origin": "online"
        }
      ],
      "code_sha256": "f375e27f61b93b37e9c8aa925f60d43c2df72faa4770159c8536f271cf4cceed",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/compliance_check_runner.py": {
      "summary": "针对待查企业或人员建立合规核查批次，从已有风险事件召回候选证据，保存可复核的匹配记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Run a minimal compliance-check workflow over existing risk_events.",
      "evidence": [
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 209,
          "symbol": "classify_match_reason",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 451,
          "symbol": "insert_target",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 485,
          "symbol": "insert_evidence",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 652,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 739,
          "symbol": "build_arg_parser",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 761,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 93,
          "symbol": "split_words",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 110,
          "symbol": "clean_corporate_number",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 117,
          "symbol": "normalize_target_type",
          "origin": "online"
        },
        {
          "file": "backend/scripts/compliance_check_runner.py",
          "line": 123,
          "symbol": "load_targets_from_csv",
          "origin": "online"
        }
      ],
      "code_sha256": "256f96d7be8069de4bb1b04e7cce59dd4e7830103153846b560fb3dbfe9ba578",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/crawl_website_responsible_person_clues.py": {
      "summary": "抓取企业官网的特定商取引、法律说明等页面，抽取销售／运营负责人线索并写入 public_representative_clues；这些线索不能直接当作现任法定代表人。默认试运行，需 --apply 才提交。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Crawl official-site legal pages for public responsible-person clues.",
      "evidence": [
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 275,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 295,
          "symbol": "extract_pairs_from_html",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 322,
          "symbol": "match_label",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 330,
          "symbol": "match_seller_label",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 364,
          "symbol": "parse_names",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 405,
          "symbol": "should_extract_from_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 421,
          "symbol": "extract_clues",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 618,
          "symbol": "insert_clues",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 679,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/crawl_website_responsible_person_clues.py",
          "line": 770,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "49406e6cc8386f44420439cc44e764b0cd131a9478de5a851c16a05ea215025a",
      "sources": [
        "company_public_legal_pages"
      ],
      "business_outputs": [
        "public_representative_clues"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/derive_company_location_profiles.py": {
      "summary": "将企业地理坐标与不动产空间数据关联，生成所在地环境画像及相关空间汇总。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Derive company location profiles from geocodes + reinfolib data.",
      "evidence": [
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 179,
          "symbol": "fetch_nearest_land",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 207,
          "symbol": "fetch_land_stats",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 237,
          "symbol": "fetch_company_density",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 266,
          "symbol": "fetch_tx_stats",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 333,
          "symbol": "upsert_profile",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 450,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 489,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 54,
          "symbol": "conn",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 62,
          "symbol": "ensure_schema",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_company_location_profiles.py",
          "line": 74,
          "symbol": "reinfolib_city_code",
          "origin": "online"
        }
      ],
      "code_sha256": "b6ca71375479e1c3c491e1042329d0d5d6ce36851795a59c0ce34601c4814118",
      "sources": [
        "company_location_profile"
      ],
      "business_outputs": [
        "company_geo_density_grid",
        "company_location_profiles"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/derive_data_quality.py": {
      "summary": "根据企业必填属性、补充属性和来源覆盖计算数据完整度分数，回写企业数据质量指标。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Derive `companies.data_quality` (smallint 0-100) from completeness signals.",
      "evidence": [
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 288,
          "symbol": "dry_run_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 323,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 85,
          "symbol": "connect_database",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 251,
          "symbol": "process_prefecture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 369,
          "symbol": "sample_select",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_data_quality.py",
          "line": 397,
          "symbol": "final_stats",
          "origin": "online"
        }
      ],
      "code_sha256": "8b4eecf43682f18b6313e828e4d020c96080b4d5aa6b247ac55f2eb8a8dd3136",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/derive_foreign_capital.py": {
      "summary": "解析已存股东名称中的国家或境外法人形式线索，聚合外资持股信号；不能等同于完整最终受益所有人识别。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Derive `company_foreign_capital` from existing `shareholders` table.",
      "evidence": [
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 178,
          "symbol": "extract_english",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 192,
          "symbol": "classify_holder",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 342,
          "symbol": "run_tests",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 409,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_foreign_capital.py",
          "line": 243,
          "symbol": "aggregate_company",
          "origin": "online"
        }
      ],
      "code_sha256": "ce5b61b01b4fa2f541b47500866fd92057699323ed8b1f2d78872501fdc8ae5a",
      "sources": [
        "edinet_foreign_capital_derived"
      ],
      "business_outputs": [
        "company_foreign_capital"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/derive_paper_co_flag.py": {
      "summary": "结合地址共享程度、成立时间及经营活动证据计算纸面公司线索评分和标记，结果属于规则推断。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Recompute `company_paper_co_flag` from current evidence (low-impact).",
      "evidence": [
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 118,
          "symbol": "run_unit_tests",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 355,
          "symbol": "dry_run_sample",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 645,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 76,
          "symbol": "addr_pts",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 87,
          "symbol": "young_pts",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 93,
          "symbol": "compute_paper_co_score",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 156,
          "symbol": "_validate_mem",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 164,
          "symbol": "session_guards_sql",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 268,
          "symbol": "_shard_predicate",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_paper_co_flag.py",
          "line": 303,
          "symbol": "apply_session_guards",
          "origin": "online"
        }
      ],
      "code_sha256": "9a4ca1191cad84cf45ad5117d38f7b1e156dfea13a80da4afce9b44cd732d44c",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/derive_risk_score.py": {
      "summary": "按企业风险事件严重度、时间衰减和有效期聚合风险分数；这是规则计算结果。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Derive `companies.risk_score` from `risk_events` aggregation.",
      "evidence": [
        {
          "file": "backend/scripts/derive_risk_score.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_risk_score.py",
          "line": 129,
          "symbol": "run_tests",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_risk_score.py",
          "line": 150,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_risk_score.py",
          "line": 63,
          "symbol": "decay",
          "origin": "online"
        },
        {
          "file": "backend/scripts/derive_risk_score.py",
          "line": 71,
          "symbol": "compute_score",
          "origin": "online"
        }
      ],
      "code_sha256": "5364ec9781d0f29d18e7bb0f7065dea5731880a81a9a67412e1134f36949333d",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/enqueue_legal_registry_requests.py": {
      "summary": "依据企业和现有任职关系筛选需要补充商业登记的对象，创建或更新 legal_registry_requests 请求队列；队列写入不等于已取得登记资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Queue companies that still need authorized commercial-registry retrieval.",
      "evidence": [
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 173,
          "symbol": "insert_requests",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 257,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 31,
          "symbol": "build_candidate_cte",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 145,
          "symbol": "preview",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests.py",
          "line": 236,
          "symbol": "print_rows",
          "origin": "online"
        }
      ],
      "code_sha256": "0a9a3af8a95e2a99733a1115cee1f3710dc0a1a7d36eebb4912c54057cc2aa1c",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/enqueue_legal_registry_requests_from_batch.py": {
      "summary": "从指定批次及企业、任职资料整理商业登记查询对象，写入 legal_registry_requests 请求队列，保留批次上下文。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Enqueue a prepared supplier batch into legal_registry_requests.",
      "evidence": [
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 255,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 30,
          "symbol": "read_batch",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 35,
          "symbol": "split_tags",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 41,
          "symbol": "company_corporation_no",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 51,
          "symbol": "retrieval_options",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 91,
          "symbol": "meta_for_row",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 124,
          "symbol": "find_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 135,
          "symbol": "has_current_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 150,
          "symbol": "find_existing_request",
          "origin": "online"
        },
        {
          "file": "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
          "line": 165,
          "symbol": "enqueue_row",
          "origin": "online"
        }
      ],
      "code_sha256": "b9c61122e81b82c5cb7eec8a201673d03f563fcea6f803dc8aea9adc3ecafb71",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/fetch_edinet_shareholders.py": {
      "summary": "解析大量持股报告及订正文件，提取发行人、共同持有人、持股数量与比例，匹配企业并写入股东资料。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Fetch EDINET 大量保有報告書 (doc_type_code 350 + 360 訂正) and populate `shareholders`.",
      "evidence": [
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 101,
          "symbol": "fetch_zip",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 182,
          "symbol": "parse_xbrl",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 570,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 90,
          "symbol": "throttle",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 140,
          "symbol": "_local_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 146,
          "symbol": "_decimal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 155,
          "symbol": "_int",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 164,
          "symbol": "_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 174,
          "symbol": "_normalize_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_shareholders.py",
          "line": 270,
          "symbol": "resolve_issuer_corp",
          "origin": "online"
        }
      ],
      "code_sha256": "bd156105c8e7b53c88f327d789f2d1889602c0c9243ab7fd0f483ac196953a93",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "shareholders"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/fetch_edinet_subsidiaries.py": {
      "summary": "解析有价证券报告书的关系公司表，提取母子公司、权益法及合营关系、持股比例和业务说明，并匹配关联法人。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Parse EDINET 有価証券報告書 (doc_type=120, form=030000) → company_relationships.",
      "evidence": [
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 82,
          "symbol": "fetch_type1",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 117,
          "symbol": "classify_subsection",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 154,
          "symbol": "parse_pct",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 208,
          "symbol": "parse_relationships_html",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 346,
          "symbol": "extract_relationships",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 435,
          "symbol": "insert_relationships",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 531,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 70,
          "symbol": "throttle",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 146,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_edinet_subsidiaries.py",
          "line": 173,
          "symbol": "detect_columns",
          "origin": "online"
        }
      ],
      "code_sha256": "82f3443b6e038534be44d944c004d935592a58e8e1a5f9481284c5a15923160b",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "company_relationships"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/fetch_legal_registry_toukikun.py": {
      "summary": "读取待查询的商业登记请求队列，在显式 --apply 且具有供应商凭据时取得登记信息，写入 company_registered_profiles 等表并回填请求状态。默认不发起正式查询；有实现不代表已经运行或有数据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Fetch commercial-registry profiles through the authorized 登記くん API.",
      "evidence": [
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 32,
          "symbol": "parse_timestamp",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 151,
          "symbol": "fetch_queue",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 210,
          "symbol": "upsert_representative_officers",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 382,
          "symbol": "mark_running",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 398,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 41,
          "symbol": "unique_names",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 57,
          "symbol": "validate_payload_corporate_number",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 74,
          "symbol": "registered_officers",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 128,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/fetch_legal_registry_toukikun.py",
          "line": 177,
          "symbol": "find_or_create_person",
          "origin": "online"
        }
      ],
      "code_sha256": "4a8293ec20630242a3ff4066c5cb4777f07e5a835fd484e3a76423193a06f5da",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/geocode_companies.py": {
      "summary": "先复用地址级缓存，再调用地理编码服务，将企业总部地址转换为坐标并记录精度与匹配信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Geocode company headquarters addresses and cache results.",
      "evidence": [
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 104,
          "symbol": "fetch_gsi",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 192,
          "symbol": "upsert_result",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 234,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 273,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 57,
          "symbol": "normalize_address_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 66,
          "symbol": "query_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 73,
          "symbol": "address_hash",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 77,
          "symbol": "infer_precision",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 87,
          "symbol": "confidence_for",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies.py",
          "line": 128,
          "symbol": "ensure_schema",
          "origin": "online"
        }
      ],
      "code_sha256": "97a3f4e1989443457c0030382862ded244011529fa3b8832779795966dea480f",
      "sources": [
        "company_geocode"
      ],
      "business_outputs": [
        "companies",
        "company_geocodes"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/geocode_companies_parallel.py": {
      "summary": "并行处理企业总部地理编码，结合缓存和退避策略保存坐标与匹配结果。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Parallel company headquarters geocoding with adaptive backoff.",
      "evidence": [
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 87,
          "symbol": "fetch_gsi",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 243,
          "symbol": "upsert_result",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 335,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 401,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 45,
          "symbol": "thread_conn",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 53,
          "symbol": "thread_client",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 62,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 68,
          "symbol": "wait",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 74,
          "symbol": "success",
          "origin": "online"
        },
        {
          "file": "backend/scripts/geocode_companies_parallel.py",
          "line": 78,
          "symbol": "limited",
          "origin": "online"
        }
      ],
      "code_sha256": "df701e9ea54857cf7fd35e893522c6830aa91b7b1cfd05042bb05318c61e75d1",
      "sources": [
        "company_geocode"
      ],
      "business_outputs": [
        "companies",
        "company_geocodes"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_aichi_sanpai_representatives.py": {
      "summary": "从愛知県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Aichi industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 164,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 212,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 271,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 302,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 344,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 377,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 460,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 95,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 103,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aichi_sanpai_representatives.py",
          "line": 107,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "1973a2b5cdb1f7ec9f77d6a0f6884f0aa1398281deda4bdfdbeb61c13861d658",
      "sources": [
        "aichi_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_aomori_alis_supporter_representatives.py": {
      "summary": "从青森県総合社会教育センター 学校教育サポーター提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Aomori ALIS school supporter pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 193,
          "symbol": "parse_table_fields",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 222,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 244,
          "symbol": "fetch_index_urls",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 253,
          "symbol": "fetch_detail_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 302,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 333,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 369,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 401,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 472,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_alis_supporter_representatives.py",
          "line": 115,
          "symbol": "normalize_spaces",
          "origin": "online"
        }
      ],
      "code_sha256": "3637d30cadab83b4196ab1c02776daf4bfb57992288148bd7a3f9050248c1c7d",
      "sources": [
        "aomori_alis_supporter"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_aomori_sanpai_association_reps.py": {
      "summary": "从青森県産業資源循環協会 協会員名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Aomori industrial-waste association members.",
      "evidence": [
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 91,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 155,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 204,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 240,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 273,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 339,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 80,
          "symbol": "normalize_postal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 84,
          "symbol": "source_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 127,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_aomori_sanpai_association_reps.py",
          "line": 134,
          "symbol": "build_company_index",
          "origin": "online"
        }
      ],
      "code_sha256": "4ce909e04456f56da4642e62ed80fc34b35013176ba8b481ff597959c21e006e",
      "sources": [
        "aomori_sanpai_association_members"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_chiba_sanpai_representatives.py": {
      "summary": "从千葉県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Chiba industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 131,
          "symbol": "parse_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 166,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 261,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 301,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 379,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 90,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 97,
          "symbol": "download_pdfs",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 117,
          "symbol": "pdftotext_layout",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 224,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_chiba_sanpai_representatives.py",
          "line": 256,
          "symbol": "company_has_current_officer",
          "origin": "online"
        }
      ],
      "code_sha256": "41630b555d66a35437b18ddbb833c9449df9e51da165a91c0e28c6c6180c7433",
      "sources": [
        "chiba_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_edinet_codelist.py": {
      "summary": "读取 EDINET 代码名单，按法人资料匹配企业，补全证券代码、EDINET 代码和上市属性。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "把 EDINET codelist (11258 上市/EDINET 注册公司) 中的 ticker / EDINET code 写入 companies.",
      "evidence": [
        {
          "file": "backend/scripts/import_edinet_codelist.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_edinet_codelist.py",
          "line": 24,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "ab5e2d46f7d84ef7e6a81feef2e7c002d0e1bc4e5259749af8d3368e037c075e",
      "sources": [
        "edinet"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_ehime_sanpai_representatives.py": {
      "summary": "从愛媛県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Ehime industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 155,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 199,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 273,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 313,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 400,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 116,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 124,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 128,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 135,
          "symbol": "download_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ehime_sanpai_representatives.py",
          "line": 243,
          "symbol": "ensure_source",
          "origin": "online"
        }
      ],
      "code_sha256": "3a22afaeff19d8b46170e856171af95eb6d7566d59c20d40a4bd9db8466b316b",
      "sources": [
        "ehime_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_enecho_retail_electric_reps.py": {
      "summary": "从資源エネルギー庁 登録小売電気事業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel、网页。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from ANRE registered retail electricity suppliers.",
      "evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 80,
          "symbol": "parse_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 96,
          "symbol": "parse_row",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 212,
          "symbol": "parse_reps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 240,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 272,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 314,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 371,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 68,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 76,
          "symbol": "compact",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_electric_reps.py",
          "line": 157,
          "symbol": "reps_from_html",
          "origin": "online"
        }
      ],
      "code_sha256": "488141d26d321a034e04c22128878cc7e8dadd4eb6496e5d8e1b7c30d22f87b3",
      "sources": [
        "enecho_retail_electric"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_enecho_retail_gas_reps.py": {
      "summary": "从資源エネルギー庁 登録ガス小売事業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from ANRE registered retail gas suppliers.",
      "evidence": [
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 80,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 103,
          "symbol": "parse_company_and_corp",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 192,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 224,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 319,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 70,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 76,
          "symbol": "compact",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 116,
          "symbol": "download_html",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 127,
          "symbol": "reps_from_html",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_enecho_retail_gas_reps.py",
          "line": 159,
          "symbol": "ensure_source",
          "origin": "online"
        }
      ],
      "code_sha256": "06cb6009486cd234449a6a74949b4dce5d9bf8b31dce7407d986027084cd0a3a",
      "sources": [
        "enecho_retail_gas"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_fsa_money_lender_reps.py": {
      "summary": "从金融庁 登録貸金業者情報検索サービス提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from FSA registered money lender search results.",
      "evidence": [
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 121,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 162,
          "symbol": "parse_source_file",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 203,
          "symbol": "parse_pdf_file",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 235,
          "symbol": "addresses_match",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 365,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 397,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 490,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 84,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 90,
          "symbol": "compact",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fsa_money_lender_reps.py",
          "line": 94,
          "symbol": "compact_address",
          "origin": "online"
        }
      ],
      "code_sha256": "7728570e225661070ad10f1e5ac2ccb6208cccb1bb53937e26b84f425290f666",
      "sources": [
        "fsa_money_lender"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_fukui_sanpai_representatives.py": {
      "summary": "从福井県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Fukui industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 166,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 213,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 281,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 314,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 391,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 95,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 103,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 107,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 114,
          "symbol": "discover_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukui_sanpai_representatives.py",
          "line": 145,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "1f11fe61bb945bffdc76e40f13a68fc232b14a18ccc99e803cd43c8165bcddb3",
      "sources": [
        "fukui_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_fukuoka_medical_corporation_reps.py": {
      "summary": "从福岡県医療法人事業報告書等提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import Fukuoka medical corporation chairpersons from public annual reports.",
      "evidence": [
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 223,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 259,
          "symbol": "parse_cover_fallback",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 298,
          "symbol": "parse_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 420,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 448,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 486,
          "symbol": "match_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 588,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 634,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 96,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_fukuoka_medical_corporation_reps.py",
          "line": 100,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "abb42381a1923c673529b31378303fe0ee8a525e355ec6e8ed5238d5c7b3152c",
      "sources": [
        "fukuoka_medical_corporation_reports"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_gbizinfo_json_representatives.py": {
      "summary": "从gBizINFO提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representative names from the official gBizINFO 法人情報 JSON zip.",
      "evidence": [
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 240,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 44,
          "symbol": "iter_representatives",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 78,
          "symbol": "build_temp_csv",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 114,
          "symbol": "load_temp_table",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 163,
          "symbol": "database_counts",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gbizinfo_json_representatives.py",
          "line": 177,
          "symbol": "apply_import",
          "origin": "online"
        }
      ],
      "code_sha256": "9f3ecc763566b930db098dcf6c4acd3369a3e09afcbd03f34522d6b7a86b1d46",
      "sources": [
        "gbizinfo"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_gifu_sanpai_representatives.py": {
      "summary": "从岐阜県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Gifu industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 161,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 202,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 270,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 303,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 380,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 92,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 100,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 104,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 111,
          "symbol": "discover_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gifu_sanpai_representatives.py",
          "line": 140,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "6f68a4840bcb660df8422863b9c5a2a774c159d0f9938e19b1823c768f6c75ca",
      "sources": [
        "gifu_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_gunma_medical_corporation_reps.py": {
      "summary": "从群馬県医療法人事業報告書等提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import Gunma medical corporation chairpersons from public annual reports.",
      "evidence": [
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 213,
          "symbol": "parse_cover_fallback",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 240,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 259,
          "symbol": "parse_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 378,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 406,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 443,
          "symbol": "match_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 545,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 590,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 97,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_gunma_medical_corporation_reps.py",
          "line": 101,
          "symbol": "normalize_spaces",
          "origin": "online"
        }
      ],
      "code_sha256": "35cb1fd164311e18bc906c408e32d99274c613d1fc43eb20427d75234548a105",
      "sources": [
        "gunma_medical_corporation_reports"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py": {
      "summary": "从阪神高速道路 有資格者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Hanshin Expressway qualified-supplier PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 132,
          "symbol": "parse_as_of",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 147,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 211,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 272,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 304,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 375,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 97,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 101,
          "symbol": "address_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 106,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hanshin_expressway_qualified_supplier_reps.py",
          "line": 113,
          "symbol": "download_pdfs",
          "origin": "online"
        }
      ],
      "code_sha256": "6c3e33d61601920ec6d11ad5a88a1544bf43f6d32cc6688281b30d4309b1afb2",
      "sources": [
        "hanshin_expressway_qualified_suppliers"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_hirakata_sanpai_representatives.py": {
      "summary": "从枚方市 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Hirakata city industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 215,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 277,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 351,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 391,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 479,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 96,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 100,
          "symbol": "raw_lines",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 105,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 110,
          "symbol": "expiry_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_hirakata_sanpai_representatives.py",
          "line": 115,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "0fc882fb51ebe461a602653085124e75c039ec935d9197b280467e8fdd1329b6",
      "sources": [
        "hirakata_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_houjin_bangou.py": {
      "summary": "解析法人编号全量或差分 CSV，按模式导入企业基本资料、处理变更并维护采集状态；初始、月度和日差分模式行为不同。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "法人番号 importer — 3 modes (initial / monthly / daily).",
      "evidence": [
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 214,
          "symbol": "run_initial",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 262,
          "symbol": "parse_list_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 326,
          "symbol": "fetch_list_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 569,
          "symbol": "run_daily_for_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 596,
          "symbol": "run_daily",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 706,
          "symbol": "run_monthly",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 783,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 109,
          "symbol": "status_from_close",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 113,
          "symbol": "transform_row",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_bangou.py",
          "line": 127,
          "symbol": "transform_row_full",
          "origin": "online"
        }
      ],
      "code_sha256": "55ae0dc597c79117e8f38d3cda39ab194d695446d73275710fdd1a4da655c4ab",
      "sources": [
        "nta_houjin"
      ],
      "business_outputs": [
        "companies",
        "company_aliases"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_houjin_via_api.py": {
      "summary": "调用法人编号 API 的编号批量查询或差分接口，解析 XML，更新企业基本及英文资料并记录处理游标。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "法人番号 Web-API importer — /4/num batch + /4/diff daily.",
      "evidence": [
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 56,
          "symbol": "fetch_num",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 73,
          "symbol": "fetch_diff_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 98,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 107,
          "symbol": "parse_corporations_xml",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 247,
          "symbol": "run_listed_backfill",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 283,
          "symbol": "run_all_corps_backfill",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 358,
          "symbol": "run_diff_window",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 435,
          "symbol": "run_fixture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 502,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_houjin_via_api.py",
          "line": 89,
          "symbol": "_t",
          "origin": "online"
        }
      ],
      "code_sha256": "4ad296ad15d19b5ec719f375e37a12b5d0e6c31ad9ae6a61d810378e2f3d6491",
      "sources": [
        "nta_houjin_api_v1"
      ],
      "business_outputs": [
        "companies",
        "company_aliases"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py": {
      "summary": "从茨城県 優良産廃処理業者認定業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Ibaraki excellent industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 194,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 253,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 327,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 367,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 458,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 98,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 102,
          "symbol": "compact_cell",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 106,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 110,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ibaraki_sanpai_excellent_representatives.py",
          "line": 117,
          "symbol": "split_representative",
          "origin": "online"
        }
      ],
      "code_sha256": "94f99d3cb1c29c35bd1f5667144f6359110ecd79210ca0ba7de80a68338acfcf",
      "sources": [
        "ibaraki_sanpai_excellent_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_imaj_advice_disclosure_reps.py": {
      "summary": "从資産運用業協会 投資助言・代理会員台帳提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF、网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from IMAJ investment-advice member disclosure PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 233,
          "symbol": "parse_profile_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 264,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 304,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 344,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 373,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 441,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 112,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 116,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 120,
          "symbol": "normalize_postal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_advice_disclosure_reps.py",
          "line": 124,
          "symbol": "expand_company_names",
          "origin": "online"
        }
      ],
      "code_sha256": "7118e4f3a23c6f3f94ac949000b84df32e194b08e1dbe18a67a119246fbb0a1e",
      "sources": [
        "imaj_advice_disclosure"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_imaj_investment_management_reps.py": {
      "summary": "从資産運用業協会 投資運用会社要覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF、网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from IMAJ investment-management disclosure PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 85,
          "symbol": "parse_representatives",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 136,
          "symbol": "parse_profile_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 169,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 203,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 232,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 310,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 74,
          "symbol": "normalize_representative_line",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 117,
          "symbol": "download_pdfs",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 178,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_imaj_investment_management_reps.py",
          "line": 271,
          "symbol": "row_json",
          "origin": "online"
        }
      ],
      "code_sha256": "84d2bdccf6b1b5a70dc1dc8f713e8420813f56f29a291ea9692f811ce8791234",
      "sources": [
        "imaj_investment_management_disclosure"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_invoice_via_api.py": {
      "summary": "分页读取发票登记差分 API，解析法人或个人经营者公告，更新登记状态、历史信息和处理游标。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "invoice_kohyo Web-API importer — /1/diff JSON 全量 + 增量.",
      "evidence": [
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 78,
          "symbol": "fetch_diff_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 104,
          "symbol": "_classify_kind",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 121,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 143,
          "symbol": "parse_announcement",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 208,
          "symbol": "upsert_batch",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 238,
          "symbol": "save_state",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 245,
          "symbol": "run_window",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 290,
          "symbol": "run_fixture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 314,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_invoice_via_api.py",
          "line": 116,
          "symbol": "_process_to_status",
          "origin": "online"
        }
      ],
      "code_sha256": "e6e77b41e6b283205a8f6592b5a4b6c93a48dbfd30a9c6ed1f0748dda1c80072",
      "sources": [
        "invoice_kohyo_api_v1"
      ],
      "business_outputs": [
        "invoice_registrants"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_ishikawa_sanpai_representatives.py": {
      "summary": "从石川県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Ishikawa industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 154,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 208,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 276,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 309,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 386,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 91,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 99,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 103,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 110,
          "symbol": "discover_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ishikawa_sanpai_representatives.py",
          "line": 133,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "30c5db959b539a498deccc04a1a3175790f4107babb3c3f6d5ec8a8a5a83d6df",
      "sources": [
        "ishikawa_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_isico_dgnet_representatives.py": {
      "summary": "从ISICO DGnet 企業情報提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from ISICO DGnet public company pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 147,
          "symbol": "parse_total",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 152,
          "symbol": "fetch_index_urls",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 188,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 229,
          "symbol": "fetch_detail_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 274,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 310,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 342,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 401,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 83,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_isico_dgnet_representatives.py",
          "line": 87,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "4d8fb63ec247c73b6a1ba8ff91c9053d53f63236b0a37d8cfcf2ea2e75dd2325",
      "sources": [
        "isico_dgnet"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_iwate_sanpai_representatives.py": {
      "summary": "从岩手県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Iwate industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 200,
          "symbol": "parse_words",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 260,
          "symbol": "parse_anchor_ratio",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 278,
          "symbol": "parse_anchor_header",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 298,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 351,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 388,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 425,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 458,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 531,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_iwate_sanpai_representatives.py",
          "line": 126,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "6594d26745a4482c6d0168df786fa66e1aff1273deed28104056b1dc867ff808",
      "sources": [
        "iwate_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_jetro_representatives.py": {
      "summary": "从ジェトロ活用事例提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representative officers from cached JETRO case-study rows.",
      "evidence": [
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 66,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 91,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 192,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 231,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 288,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 62,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 83,
          "symbol": "source_id",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 130,
          "symbol": "build_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jetro_representatives.py",
          "line": 262,
          "symbol": "apply_candidates",
          "origin": "online"
        }
      ],
      "code_sha256": "9f9eda1664697e6491b8f84dc05111e2c3dda5867757fc4f5a767d2607647b4d",
      "sources": [
        "jetro_case_studies"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_jgoodtech_representatives.py": {
      "summary": "从J-GoodTech 公開企業プロフィール提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import public representative names from J-GoodTech company pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 134,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 296,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 329,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 404,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 76,
          "symbol": "clean_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 89,
          "symbol": "clean_position",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 112,
          "symbol": "choose_representative_identity",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 127,
          "symbol": "search_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 185,
          "symbol": "ensure_checkpoint_table",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jgoodtech_representatives.py",
          "line": 213,
          "symbol": "checkpoint_result",
          "origin": "online"
        }
      ],
      "code_sha256": "4e710b773eba4d2ad369429aff3dcf47d07986aef6b2bdda47bd6b33e9da6cea",
      "sources": [
        "jgoodtech"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_jmra_pmark_representatives.py": {
      "summary": "从JMRA プライバシーマーク付与適格決定事業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from JMRA public PrivacyMark list.",
      "evidence": [
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 161,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 207,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 243,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 275,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 325,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 77,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 81,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 85,
          "symbol": "postal_code",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 90,
          "symbol": "expand_company_names",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jmra_pmark_representatives.py",
          "line": 114,
          "symbol": "clean_person_name",
          "origin": "online"
        }
      ],
      "code_sha256": "4f939cf7a4d7fd1b2a468f1e43585b0daae79761c932aeba8873db3f74511dfe",
      "sources": [
        "pmark_jmra"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_jsda_member_representatives.py": {
      "summary": "从日本証券業協会 会員名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Japan Securities Dealers Association lists.",
      "evidence": [
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 187,
          "symbol": "parse_member_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 244,
          "symbol": "parse_html_file_specs",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 254,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 329,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 367,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 396,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 465,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 123,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 127,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_jsda_member_representatives.py",
          "line": 131,
          "symbol": "normalize_postal",
          "origin": "online"
        }
      ],
      "code_sha256": "6d527321fb815dd075f087641590a0fe8169f6af6d59ee9f1c2bb8c59803779e",
      "sources": [
        "jsda_members"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kagawa_sanpai_representatives.py": {
      "summary": "从香川県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Kagawa industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 181,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 238,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 312,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 352,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 438,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 105,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 109,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 113,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 120,
          "symbol": "split_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagawa_sanpai_representatives.py",
          "line": 153,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "967b763fed83ee0005c10e443b01f89490fc89140e6b6f640b3e383dc12d41a0",
      "sources": [
        "kagawa_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py": {
      "summary": "从鹿児島県 優良産廃処理業者認定基準適合処理業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Kagoshima excellent industrial-waste licensee table.",
      "evidence": [
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 107,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 158,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 231,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 271,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 352,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 82,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 86,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 93,
          "symbol": "split_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 202,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kagoshima_sanpai_excellent_representatives.py",
          "line": 226,
          "symbol": "company_has_current_officer",
          "origin": "online"
        }
      ],
      "code_sha256": "341bb6981d81e2474f8175de8fe92f4a4d0209d91aff76fa93f2c1bb097edcd0",
      "sources": [
        "kagoshima_sanpai_excellent_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kaigo_service_representatives.py": {
      "summary": "从介護サービス情報公表システム 事業所詳細提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from public Kaigo service detail pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 157,
          "symbol": "parse_rep",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 250,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 346,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 376,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 473,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 94,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 98,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 102,
          "symbol": "clean_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 119,
          "symbol": "clean_position",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kaigo_service_representatives.py",
          "line": 129,
          "symbol": "detail_url",
          "origin": "online"
        }
      ],
      "code_sha256": "c4a905f6f7ec735751a752d2f10d363e3b0eb35f1097d2abb7e997527be7fedd",
      "sources": [
        "kaigo_service_public_detail"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kanagawa_sanpai_representatives.py": {
      "summary": "从神奈川県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Kanagawa industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 128,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 168,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 256,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 296,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 378,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 95,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 101,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 108,
          "symbol": "download_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 226,
          "symbol": "ensure_source",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kanagawa_sanpai_representatives.py",
          "line": 251,
          "symbol": "company_has_current_officer",
          "origin": "online"
        }
      ],
      "code_sha256": "8e5e159ab249877c551b5fa9e40e22d3864efa1aff9a2f294991393a9eb871e9",
      "sources": [
        "kanagawa_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_koeki_info_representatives.py": {
      "summary": "从公益法人information 公益法人等詳細提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from the official Koeki Hojin information site.",
      "evidence": [
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 235,
          "symbol": "parse_search_hits",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 256,
          "symbol": "parse_corporation_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 265,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 319,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 357,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 386,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 546,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 112,
          "symbol": "detail_deadline",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 117,
          "symbol": "_raise_timeout",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_koeki_info_representatives.py",
          "line": 130,
          "symbol": "normalize_spaces",
          "origin": "online"
        }
      ],
      "code_sha256": "d2a5ba68864bdb60f115181b04b5b1525dd2d562c855951173d06b3ed5650529",
      "sources": [
        "koeki_info_representatives"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kokodesearch_representatives.py": {
      "summary": "从ここdeサーチ 子ども・子育て支援情報公表システム 全国施設CSV提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from public ここdeサーチ childcare facility CSVs.",
      "evidence": [
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 217,
          "symbol": "parse_zip",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 283,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 311,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 319,
          "symbol": "match_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 457,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 537,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 119,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 123,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 127,
          "symbol": "source_zip_default",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kokodesearch_representatives.py",
          "line": 131,
          "symbol": "out_default",
          "origin": "online"
        }
      ],
      "code_sha256": "6b7e863d74183a0cba0f32acfcd770bbb9d778f240d8fc112d0ddd14b36112cd",
      "sources": [
        "kokodesearch_childcare_facility_csv"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_kumamoto_religious_reps.py": {
      "summary": "从熊本県 宗教法人名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representative officers from Kumamoto religious corporation open data.",
      "evidence": [
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 142,
          "symbol": "parse_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 199,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 238,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 267,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 327,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 99,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 103,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 107,
          "symbol": "normalize_name_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 111,
          "symbol": "normalize_address_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_kumamoto_religious_reps.py",
          "line": 117,
          "symbol": "clean_person_name",
          "origin": "online"
        }
      ],
      "code_sha256": "ea9297d72bcf0cefcfb7bc2c781d846f34ef330bd444968a3877b41a52ec3341",
      "sources": [
        "kumamoto_religious_corporations"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_maebashi_sanpai_disposal_representatives.py": {
      "summary": "从前橋市 産業廃棄物処分業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Maebashi industrial-waste disposal licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 165,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 222,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 296,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 336,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 425,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 89,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 93,
          "symbol": "compact_cell",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 97,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 101,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_maebashi_sanpai_disposal_representatives.py",
          "line": 108,
          "symbol": "clean_company_name",
          "origin": "online"
        }
      ],
      "code_sha256": "35fac1eb62d5255e708a0aee033777c76f0a880f0d336774ae935d52d97b8a16",
      "sources": [
        "maebashi_sanpai_disposal_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_medical_info_net_pharmacy_reps.py": {
      "summary": "从厚生労働省 医療情報ネット 薬局詳細提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from MHLW Medical Information Net pharmacy pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 319,
          "symbol": "parse_zip",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 402,
          "symbol": "parse_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 426,
          "symbol": "fetch_detail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 434,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 519,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 549,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 626,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 200,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 204,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
          "line": 208,
          "symbol": "normalize_company_key",
          "origin": "online"
        }
      ],
      "code_sha256": "13c8177485002c1b3b769a5167e72215ecf614f77d896ddc058241f583f5ace2",
      "sources": [
        "medical_info_net_pharmacy"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_meti_alcohol_reps.py": {
      "summary": "从経済産業省 アルコール事業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from METI alcohol business operator lists.",
      "evidence": [
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 81,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 179,
          "symbol": "parse_source_file",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 264,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 296,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 402,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 71,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 77,
          "symbol": "compact",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 96,
          "symbol": "local_name_for_url",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 102,
          "symbol": "url_for_local_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_meti_alcohol_reps.py",
          "line": 109,
          "symbol": "detail_urls_from_index",
          "origin": "online"
        }
      ],
      "code_sha256": "1d929e3567d36c55534a263b560ae8ebfd338872ec64f9cf108914385315d991",
      "sources": [
        "meti_alcohol"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_miyagi_sanpai_excellent_representatives.py": {
      "summary": "从宮城県 優良産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Miyagi excellent industrial-waste licensee Excel.",
      "evidence": [
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 169,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 223,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 297,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 337,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 426,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 90,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 98,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 102,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 109,
          "symbol": "discover_file",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_miyagi_sanpai_excellent_representatives.py",
          "line": 131,
          "symbol": "download_file",
          "origin": "online"
        }
      ],
      "code_sha256": "fb7c1da7511ba2e97ac6941d917d31884b9ebc5032ce2d309ff0c3553af3564b",
      "sources": [
        "miyagi_sanpai_excellent_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_mlit_chintai_management_reps.py": {
      "summary": "从国土交通省 賃貸住宅管理業者検索、国土交通省 住宅宿泊管理業者検索、国土交通省 マンション管理業者検索提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from MLIT TAKKEN management business searches.",
      "evidence": [
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 237,
          "symbol": "parse_result_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 274,
          "symbol": "fetch_prefecture_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 322,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 368,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 404,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 433,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 491,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 125,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 129,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_mlit_chintai_management_reps.py",
          "line": 133,
          "symbol": "kanji_number",
          "origin": "online"
        }
      ],
      "code_sha256": "fb9d676d03a6de010f4f2133c2b62bfff7938e12ff701f1aa5abe2063d822bbd",
      "sources": [
        "mlit_chintai_management",
        "mlit_jutaku_shukuhaku_management",
        "mlit_mansion_management"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_moj_registered_support_org_reps.py": {
      "summary": "从出入国在留管理庁 登録支援機関登録簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from the ISA registered support organization list.",
      "evidence": [
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 115,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 208,
          "symbol": "addresses_match",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 311,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 343,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 438,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 88,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 97,
          "symbol": "compact",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 101,
          "symbol": "compact_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 106,
          "symbol": "clean_postal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_moj_registered_support_org_reps.py",
          "line": 130,
          "symbol": "discover_excel_url",
          "origin": "online"
        }
      ],
      "code_sha256": "e5b4c5fed62253dd612346b4db84a2aee1b62bc6f2eec220bb96a738562de6f0",
      "sources": [
        "moj_registered_support_org"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_molink_representatives.py": {
      "summary": "从木材SCM支援システム もりんく 事業者詳細提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from public molink company profile pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 155,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 174,
          "symbol": "parse_profile",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 202,
          "symbol": "fetch_profile",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 214,
          "symbol": "match_profile",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 327,
          "symbol": "upsert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 378,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 102,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 106,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 110,
          "symbol": "normalize_name_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_molink_representatives.py",
          "line": 114,
          "symbol": "normalize_address_key",
          "origin": "online"
        }
      ],
      "code_sha256": "717d55ac9b495da96a21093bb87a18f8c03b52f61271bae53bb28c3c4576d891",
      "sources": [
        "molink_company_profiles"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_nagano_sanpai_representatives.py": {
      "summary": "从長野県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Nagano industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 177,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 230,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 276,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 309,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 393,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 94,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 102,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 106,
          "symbol": "clean_source_field",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 110,
          "symbol": "split_company_cell",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nagano_sanpai_representatives.py",
          "line": 120,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "d5956a45eb50163875aa2b16b4691601e5d026432d5eb0c4ca2156118f74ccf7",
      "sources": [
        "nagano_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_nexco_east_qualified_supplier_reps.py": {
      "summary": "从NEXCO東日本 有資格者情報検索提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from NEXCO East public qualified-supplier pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 155,
          "symbol": "parse_total_count",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 161,
          "symbol": "parse_as_of",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 167,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 205,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 233,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 310,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 342,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 412,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 112,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_east_qualified_supplier_reps.py",
          "line": 116,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "d29d2fa1de21dbd91ad05efb82d480a55dc93a69fb86e9074f029a87b92efad2",
      "sources": [
        "nexco_east_qualified_suppliers"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_nexco_west_qualified_supplier_reps.py": {
      "summary": "从NEXCO西日本 有資格者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from NEXCO West public qualified-supplier Excel files.",
      "evidence": [
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 110,
          "symbol": "parse_as_of",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 121,
          "symbol": "parse_first_cell",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 128,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 202,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 263,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 295,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 362,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 94,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 98,
          "symbol": "address_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_nexco_west_qualified_supplier_reps.py",
          "line": 103,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "99ad8cffaa37454be4fa6b33072819c977f22ec36f6ac7eb0e7f9affcad00c86",
      "sources": [
        "nexco_west_qualified_suppliers"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_niigata_sanpai_representatives.py": {
      "summary": "从新潟県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Niigata industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 167,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 213,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 281,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 314,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 394,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 96,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 104,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 108,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 115,
          "symbol": "discover_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_niigata_sanpai_representatives.py",
          "line": 146,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "ea1c043c7b973239bdb141adf5e155b8e8c7bb0a50f43972c6a41f084e7542ba",
      "sources": [
        "niigata_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_npo_representatives.py": {
      "summary": "从NPO 法人ポータルサイト (内閣府)提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import NPO representative names from the Cabinet Office NPO portal.",
      "evidence": [
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 85,
          "symbol": "parse_representative_part",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 116,
          "symbol": "parse_representatives",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 160,
          "symbol": "fetch_matched_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 208,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 237,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 296,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 60,
          "symbol": "download_zip",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 74,
          "symbol": "read_csv_from_zip",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 133,
          "symbol": "source_id",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_npo_representatives.py",
          "line": 141,
          "symbol": "build_candidates",
          "origin": "online"
        }
      ],
      "code_sha256": "a7d47ce692d1e756b0fdc26d81b354c9584591976bbdb3eaf81f5f00fa601f04",
      "sources": [
        "npo_houjin"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_osaka_city_sanpai_representatives.py": {
      "summary": "从大阪市 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Osaka City industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 214,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 261,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 345,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 385,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 474,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 92,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 96,
          "symbol": "raw_lines",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 101,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 108,
          "symbol": "loose_address_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_city_sanpai_representatives.py",
          "line": 113,
          "symbol": "clean_company_name",
          "origin": "online"
        }
      ],
      "code_sha256": "1112eb5e7dbd9450014c072b1b549582c1506c262c8625338aa3efd349333ef9",
      "sources": [
        "osaka_city_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_osaka_medical_corporation_reps.py": {
      "summary": "从大阪府医療法人事業報告書等提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import Osaka medical corporation chairpersons from public report PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 221,
          "symbol": "parse_medical_number",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 228,
          "symbol": "parse_corporation_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 242,
          "symbol": "parse_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 262,
          "symbol": "run_tesseract",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 357,
          "symbol": "parse_representative_from_image",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 397,
          "symbol": "parse_report_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 629,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 664,
          "symbol": "fetch_address_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 702,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_medical_corporation_reps.py",
          "line": 741,
          "symbol": "match_records",
          "origin": "online"
        }
      ],
      "code_sha256": "5245b6c2c76f3e523ff697f66dbbeddcd6d03768bb00aed2a26c90954d23d945",
      "sources": [
        "osaka_medical_corporation_reports"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_osaka_sanpai_representatives.py": {
      "summary": "从大阪府 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Osaka industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 218,
          "symbol": "parse_standard_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 265,
          "symbol": "parse_excellent_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 312,
          "symbol": "parse_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 324,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 412,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 452,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 552,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 114,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 124,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_osaka_sanpai_representatives.py",
          "line": 129,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "dac9b79a231d8f2e0a675b47d3262b7a3b8c6ec8382df291b168634130c5d6a7",
      "sources": [
        "osaka_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_public_representative_clues.py": {
      "summary": "整理非权威公开页面中的代表人线索，保存来源及匹配结果；线索与法定登记代表人证据分开。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import non-authoritative public representative clues.",
      "evidence": [
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 94,
          "symbol": "parse_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 136,
          "symbol": "fetch_mhlw_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 197,
          "symbol": "insert_clues",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 290,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 84,
          "symbol": "clean_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 90,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_public_representative_clues.py",
          "line": 187,
          "symbol": "ensure_table",
          "origin": "online"
        }
      ],
      "code_sha256": "c3f4add466188bb3f1cec6d4b88f65e01e7851967231bceeabae9eb84c4481a8",
      "sources": [
        "mhlw_koyou_fraud"
      ],
      "business_outputs": [
        "public_representative_clues"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_registry_supplier_return.py": {
      "summary": "导入登记供应商返回文件并匹配企业，更新 legal_registry_requests 的处理结果；具体登记内容是否落到其他业务表仍需独立证据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Bulk-import supplier returned registry/company representative data.",
      "evidence": [
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 67,
          "symbol": "parse_bool",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 76,
          "symbol": "parse_json_maybe",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 90,
          "symbol": "parse_officers",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 129,
          "symbol": "parse_int",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 301,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 35,
          "symbol": "split_names",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 141,
          "symbol": "read_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 172,
          "symbol": "normalize_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 224,
          "symbol": "find_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_registry_supplier_return.py",
          "line": 235,
          "symbol": "find_open_request",
          "origin": "online"
        }
      ],
      "code_sha256": "40345081c0eee8d88d4e4592c66b5bde883c68466a44cb2330f36a980ffc76a3",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_saitama_medical_corporation_reps.py": {
      "summary": "从埼玉県医療法人決算届提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import Saitama medical corporation chairpersons from public closing reports.",
      "evidence": [
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 311,
          "symbol": "parse_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 398,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 428,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 461,
          "symbol": "match_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 567,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 612,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 118,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 122,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 126,
          "symbol": "normalize_name_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_saitama_medical_corporation_reps.py",
          "line": 130,
          "symbol": "decode_zip_name",
          "origin": "online"
        }
      ],
      "code_sha256": "5da7bbd309de6e770866861e6b155bcfcf9b50a68d0381b7303105768550e125",
      "sources": [
        "saitama_medical_corporation_reports"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_sakai_sanpai_representatives.py": {
      "summary": "从堺市 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Sakai city industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 215,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 255,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 329,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 369,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 458,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 92,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 100,
          "symbol": "raw_lines",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 105,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 109,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sakai_sanpai_representatives.py",
          "line": 116,
          "symbol": "split_company_rep",
          "origin": "online"
        }
      ],
      "code_sha256": "6482d2532990b5cb88716bbcfb84f4efc0f23ccbcaebcce9db0fd2d3991f88a9",
      "sources": [
        "sakai_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_sme_ma_support_institution_reps.py": {
      "summary": "从中小企業庁 M&A支援機関登録制度 登録支援機関データベース提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from the public M&A support institution database.",
      "evidence": [
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 118,
          "symbol": "extract_total_count",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 124,
          "symbol": "parse_list_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 152,
          "symbol": "extract_detail_fields",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 283,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 315,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 408,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 87,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 91,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 95,
          "symbol": "clean_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_sme_ma_support_institution_reps.py",
          "line": 110,
          "symbol": "first_wire_component",
          "origin": "online"
        }
      ],
      "code_sha256": "e6a8dfbaa18f33d44877c08c5e92065fb22b0d4b8c70ab1b1b93726025f42bd1",
      "sources": [
        "sme_ma_support_institution"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_soumu_registered_telecom_reps.py": {
      "summary": "从総務省 登録電気通信事業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Soumu registered telecom operator list.",
      "evidence": [
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 120,
          "symbol": "parse_xls",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 244,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 276,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 332,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 69,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 73,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 77,
          "symbol": "corporate_number_from_cell",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 87,
          "symbol": "split_registration",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 95,
          "symbol": "clean_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_soumu_registered_telecom_reps.py",
          "line": 110,
          "symbol": "download_xls",
          "origin": "online"
        }
      ],
      "code_sha256": "07b230b8290a0bb751593e876293deb621454501822ad9d83222180f1c777e94",
      "sources": [
        "soumu_registered_telecom"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_t2fifa_member_representatives.py": {
      "summary": "从第二種金融商品取引業協会 正会員名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Type II Financial Instruments Firms Association.",
      "evidence": [
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 176,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 183,
          "symbol": "parse_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 222,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 272,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 310,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 339,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 403,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 104,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 108,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_t2fifa_member_representatives.py",
          "line": 112,
          "symbol": "normalize_postal",
          "origin": "online"
        }
      ],
      "code_sha256": "e0fa7f93c2a3eeea2e6f9d0d88044e385614e0dc87780f7bf6ac68a8244c2bb4",
      "sources": [
        "t2fifa_members"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_takatsuki_sanpai_representatives.py": {
      "summary": "从高槻市 産業廃棄物処理業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Takatsuki city industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 198,
          "symbol": "parse_collection",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 242,
          "symbol": "parse_disposal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 286,
          "symbol": "parse_excellent",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 323,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 341,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 424,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 464,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 555,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 96,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_takatsuki_sanpai_representatives.py",
          "line": 100,
          "symbol": "raw_lines",
          "origin": "online"
        }
      ],
      "code_sha256": "68e0499a0a2902856f8c2a2e06fe8a86f85402e049afc85a504bdd9268ff0e4a",
      "sources": [
        "takatsuki_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_tochigi_sanpai_representatives.py": {
      "summary": "从栃木県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Tochigi industrial-waste licensee Excels.",
      "evidence": [
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 209,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 261,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 356,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 396,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 491,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 113,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 123,
          "symbol": "first_line",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 131,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 138,
          "symbol": "kanji_number_to_int",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tochigi_sanpai_representatives.py",
          "line": 151,
          "symbol": "address_key",
          "origin": "online"
        }
      ],
      "code_sha256": "78e51394bb990f481b76b45965668cee13d7ff4abf46c5d734af271cd2d0367d",
      "sources": [
        "tochigi_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_tokyo_sanpai_representatives.py": {
      "summary": "从東京都 産業廃棄物処理業者情報検索提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Tokyo industrial-waste licensee search.",
      "evidence": [
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 134,
          "symbol": "parse_page_info",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 141,
          "symbol": "parse_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 224,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 294,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 339,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 376,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 410,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 483,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 102,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_sanpai_representatives.py",
          "line": 106,
          "symbol": "form_hidden_fields",
          "origin": "online"
        }
      ],
      "code_sha256": "c0ca01bb8496b836186ca4c2261ea967fef1d0a7b4c3528ee8e4edacc1ca8086",
      "sources": [
        "tokyo_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_tokyo_taishin_architect_reps.py": {
      "summary": "从東京都木造住宅耐震診断事務所登録名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Tokyo wooden-house seismic diagnosis office list.",
      "evidence": [
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 178,
          "symbol": "extract_legal_entity_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 227,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 290,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 329,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 358,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 430,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 130,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 134,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 138,
          "symbol": "normalize_postal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tokyo_taishin_architect_reps.py",
          "line": 142,
          "symbol": "kanji_number",
          "origin": "online"
        }
      ],
      "code_sha256": "063266404df9cd785e2ceab8cd0acc597bfc2e48d20065c7374a2349f485add5",
      "sources": [
        "tokyo_taishin_architect"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_tosankyo_member_representatives.py": {
      "summary": "从東京都産業資源循環協会 正会員名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Tokyo Industrial Waste Association members.",
      "evidence": [
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 109,
          "symbol": "fetch_page",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 155,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 196,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 245,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 281,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 315,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 386,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 90,
          "symbol": "clean_company_and_phone",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 99,
          "symbol": "clean_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_tosankyo_member_representatives.py",
          "line": 168,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "e457f27383587d5f5f80bc6b0890e4eb893627102392a2e1480eeb8c1870fb1f",
      "sources": [
        "tosankyo_members"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_toyama_sanpai_association_reps.py": {
      "summary": "从富山県産業資源循環協会 処理業許可業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Toyama industrial-waste association members.",
      "evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 103,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 168,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 218,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 254,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 287,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 351,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 92,
          "symbol": "normalize_postal",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 96,
          "symbol": "source_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 140,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_association_reps.py",
          "line": 147,
          "symbol": "build_company_index",
          "origin": "online"
        }
      ],
      "code_sha256": "25b0d0a5f5965e513d90a60f7994ab4bdd8aeac3b909b56adcf921ce06f5e20f",
      "sources": [
        "toyama_sanpai_association_members"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_toyama_sanpai_representatives.py": {
      "summary": "从富山県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Toyama industrial-waste licensee Excel.",
      "evidence": [
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 161,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 211,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 279,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 312,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 392,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 92,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 100,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 104,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 111,
          "symbol": "discover_files",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyama_sanpai_representatives.py",
          "line": 140,
          "symbol": "download_files",
          "origin": "online"
        }
      ],
      "code_sha256": "32cc557e0fd46adab244599ca4cc70c015b8e3d3d6e904c4ab596493fcf0dd19",
      "sources": [
        "toyama_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_toyonaka_sanpai_representatives.py": {
      "summary": "从豊中市 産業廃棄物処理業者一覧提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Toyonaka city industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 157,
          "symbol": "href_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 217,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 273,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 356,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 396,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 487,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 97,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 101,
          "symbol": "raw_lines",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 106,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_toyonaka_sanpai_representatives.py",
          "line": 111,
          "symbol": "db_address",
          "origin": "online"
        }
      ],
      "code_sha256": "ef98faabe1a29dfbf8dad18ee4bb452e73dce9034562c175a1272e12e693e69c",
      "sources": [
        "toyonaka_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_university_portrait_representatives.py": {
      "summary": "从大学ポートレート（私学版）法人情報提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import school corporation chairpersons from University Portrait pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 145,
          "symbol": "parse_info_table",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 175,
          "symbol": "parse_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 206,
          "symbol": "fetch_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 246,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 274,
          "symbol": "address_matches",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 312,
          "symbol": "match_records",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 413,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 490,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 87,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_university_portrait_representatives.py",
          "line": 91,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "b9d08f363f17ce626105d300dfce10ce69228d8492cd7ff755489129ced8683b",
      "sources": [
        "university_portrait_private_school"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_ur_qualified_supplier_reps.py": {
      "summary": "从UR都市機構 有資格者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from UR qualified supplier public PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 112,
          "symbol": "parse_header_line",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 129,
          "symbol": "parse_pdf_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 168,
          "symbol": "extract_pdf_reps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 248,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 280,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 330,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 87,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 91,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 95,
          "symbol": "clean_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_ur_qualified_supplier_reps.py",
          "line": 106,
          "symbol": "clean_company_line",
          "origin": "online"
        }
      ],
      "code_sha256": "77a65f29e17ea1789c1be57724108260bc8a3f07c0f2c0f67b61a657e0f30325",
      "sources": [
        "ur_qualified_suppliers"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_wam_disability_representatives.py": {
      "summary": "从WAM 障害福祉サービス等情報公表システム 事業所詳細提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括网页。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from public WAM disability-welfare detail pages.",
      "evidence": [
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 153,
          "symbol": "extract_search_form",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 167,
          "symbol": "fetch_search_form",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 190,
          "symbol": "fetch_detail_html",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 209,
          "symbol": "parse_rep",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 303,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 397,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 427,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 530,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 96,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_disability_representatives.py",
          "line": 100,
          "symbol": "compact_text",
          "origin": "online"
        }
      ],
      "code_sha256": "f37b53d14debd0a19ccb950f7c600a03fa37c7324089152164b8239620414525",
      "sources": [
        "wam_disability_public_detail"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_wam_social_welfare_reps.py": {
      "summary": "从WAM NET 社会福祉法人 現況報告書提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import social welfare corporation representatives from WAM NET reports.",
      "evidence": [
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 115,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 191,
          "symbol": "parse_detail_payload",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 218,
          "symbol": "extract_director_rep",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 234,
          "symbol": "fetch_wam_rep",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 309,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 338,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 398,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 88,
          "symbol": "normalize_spaces",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 92,
          "symbol": "compact_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_wam_social_welfare_reps.py",
          "line": 96,
          "symbol": "clean_person_name",
          "origin": "online"
        }
      ],
      "code_sha256": "1a125a2e3b66114a5109cd85706dc81ba93ff7bf8fb2eb52715d434bdc6b472c",
      "sources": [
        "wam_social_welfare_current_report"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_yamagata_sanpai_representatives.py": {
      "summary": "从山形県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括Excel。 默认试运行，需 --apply 才实际写入。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Yamagata industrial-waste licensee Excel ZIP.",
      "evidence": [
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 225,
          "symbol": "parse_workbook",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 267,
          "symbol": "match_company",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 355,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 395,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 479,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 113,
          "symbol": "cell_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 123,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 130,
          "symbol": "split_representative",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 149,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamagata_sanpai_representatives.py",
          "line": 156,
          "symbol": "kanji_number_to_int",
          "origin": "online"
        }
      ],
      "code_sha256": "c5945c7612ae85dbd8e4119293e9c113def781562e0cdaf88bb83044dca43ee7",
      "sources": [
        "yamagata_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/import_yamanashi_sanpai_representatives.py": {
      "summary": "从山梨県 産業廃棄物処理業者名簿提取代表人或负责人线索，清洗姓名并匹配本地法人，写入人员和企业任职关系。 解析入口包括PDF。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Import representatives from Yamanashi industrial-waste licensee PDFs.",
      "evidence": [
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 161,
          "symbol": "parse_pdf",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 262,
          "symbol": "match_company_from_index",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 293,
          "symbol": "fetch_current_officer_corps",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 330,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 363,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 434,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 90,
          "symbol": "db_address",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 97,
          "symbol": "permit_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 101,
          "symbol": "is_valid_person_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/import_yamanashi_sanpai_representatives.py",
          "line": 107,
          "symbol": "discover_files",
          "origin": "online"
        }
      ],
      "code_sha256": "69eeddf90a11264593ede37c9d09986296ba4c17e85ac8d5ca44a8c5fa98d658",
      "sources": [
        "yamanashi_sanpai_waste_licensees"
      ],
      "business_outputs": [
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/match_virtual_offices.py": {
      "summary": "将企业地址热点与运营商网点按地址和楼名匹配，保存虚拟办公室候选关联及置信度。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "match_virtual_offices — virtual_office_locations と companies の hot-spot を交叉验证.",
      "evidence": [
        {
          "file": "backend/scripts/match_virtual_offices.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/match_virtual_offices.py",
          "line": 274,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/match_virtual_offices.py",
          "line": 330,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "2bd9619b2024fa7317d51de0e2bb2fd294c74c9c57e2b4d78d296d04fe9f948c",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/merge_address_clusters_v2.py": {
      "summary": "在同一地址范围内按去楼层房号后的楼名主干合并碎片地址簇，并更新企业簇引用，保留原簇。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "address_clusters 二级聚类 (v2): 合并\"同楼不同层/不同房号\"的碎片化 cluster。",
      "evidence": [
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 141,
          "symbol": "building_match_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 427,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 102,
          "symbol": "canonical_street_key",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 121,
          "symbol": "building_stem",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 149,
          "symbol": "__init__",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 152,
          "symbol": "find",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 163,
          "symbol": "union",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 168,
          "symbol": "groups",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 175,
          "symbol": "plan_merges_for_chome",
          "origin": "online"
        },
        {
          "file": "backend/scripts/merge_address_clusters_v2.py",
          "line": 309,
          "symbol": "ensure_migration",
          "origin": "online"
        }
      ],
      "code_sha256": "c5773e75bc8d3b71f1e340a08d652e2e01f33d436389231790fde25bd651ce4e",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/nta_history_backfill.py": {
      "summary": "按法人编号请求包含历史的国税厅 API，保存各时点快照及前次名称和地址，并补充历史名称别名。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "NTA 法人番号 Web-API /4/num?history=1 → company_changes.",
      "evidence": [
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 63,
          "symbol": "fetch_num_history",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 91,
          "symbol": "_parse_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 100,
          "symbol": "_parse_int",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 106,
          "symbol": "parse_history_xml",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 261,
          "symbol": "upsert_history",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 313,
          "symbol": "run_fixture",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 435,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 83,
          "symbol": "_t",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 151,
          "symbol": "compute_prev_diffs",
          "origin": "online"
        },
        {
          "file": "backend/scripts/nta_history_backfill.py",
          "line": 170,
          "symbol": "former_name_alias_rows",
          "origin": "online"
        }
      ],
      "code_sha256": "f4fedb646a04ae893ca56577cac301d9be340c36ee3c7ab212a0ffcb6879fe16",
      "sources": [
        "nta_houjin_api_v1"
      ],
      "business_outputs": [
        "companies",
        "company_aliases",
        "company_changes"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/parse_change_cause.py": {
      "summary": "解析国税厅变更原因文本中的日期、对方法人编号和合并或分割动词，生成有方向的企业关系并保留原文。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Parse companies.change_cause (NTA 法人番号 Web-API 自由文) into\nstructured rows in company_relationships.",
      "evidence": [
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 232,
          "symbol": "parse_iso_date",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 244,
          "symbol": "extract_name",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 295,
          "symbol": "_parse_entry",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 334,
          "symbol": "parse_one_row",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 409,
          "symbol": "fetch_rows",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 421,
          "symbol": "already_inserted_keys",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 447,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_change_cause.py",
          "line": 98,
          "symbol": "_to_int",
          "origin": "online"
        }
      ],
      "code_sha256": "e8878f9093bfbc733287a9df9887cd49a04052c42471134f527c3d24aeaac9a5",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/parse_courts_hanrei_pdfs.py": {
      "summary": "下载判决 PDF 并提取正文，解析企业当事人候选并进行实体匹配；文档解析单独保存，高置信企业关联才进入面向企业的风险记录。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Parse courts_hanrei judgment PDFs and resolve company parties.",
      "evidence": [
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 338,
          "symbol": "extract_company_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 431,
          "symbol": "extract_judges",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 460,
          "symbol": "extract_section",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 497,
          "symbol": "extract_disposition",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 509,
          "symbol": "extract_claims",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 519,
          "symbol": "extract_issues",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 531,
          "symbol": "extract_outline",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 557,
          "symbol": "extract_structured_fields",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 610,
          "symbol": "extract_text",
          "origin": "online"
        },
        {
          "file": "backend/scripts/parse_courts_hanrei_pdfs.py",
          "line": 790,
          "symbol": "upsert_parse_result",
          "origin": "online"
        }
      ],
      "code_sha256": "d7af94d796f24b1adc1bf818b3735283e54dc55db7302e9f88b6386b3738dc8c",
      "sources": [
        "courts_hanrei"
      ],
      "business_outputs": [
        "court_case_company_links",
        "court_case_facts",
        "court_case_judges",
        "court_hanrei_pdf_parses",
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/recompute_address_share_count.py": {
      "summary": "按规范后的都道府县、市区、番地和楼宇组合重算同址企业数量。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "companies.address_share_count を building 拆分後の住所粒度で再計算。",
      "evidence": [
        {
          "file": "backend/scripts/recompute_address_share_count.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/recompute_address_share_count.py",
          "line": 65,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "3905dace47ef85909e692d883a4bda7e5b9806618e91bf1e108e489030c1f467",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/recompute_share_count_by_cluster.py": {
      "summary": "按地址簇重算企业同址数量，并同步相关纸面公司线索数据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "按 address_cluster_id 重算 companies.address_share_count + paper_co_flag.address_share_count.",
      "evidence": [
        {
          "file": "backend/scripts/recompute_share_count_by_cluster.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/recompute_share_count_by_cluster.py",
          "line": 70,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "42207c634aa0340a6bbf611f44d4aaab54610c0e544f8d69119d032e0d1ee75b",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/refetch_missing_gbizinfo_html.py": {
      "summary": "重新取得缺少正文归档的 gBizINFO 页面，提取官网和代表人并补全原始文档处理状态。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Refetch gBizINFO HTML rows that were stored without S3 content.",
      "evidence": [
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 65,
          "symbol": "fetch_candidates",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 88,
          "symbol": "upsert_person",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 107,
          "symbol": "insert_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 235,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 301,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 131,
          "symbol": "persist_officer",
          "origin": "online"
        },
        {
          "file": "backend/scripts/refetch_missing_gbizinfo_html.py",
          "line": 156,
          "symbol": "worker",
          "origin": "online"
        }
      ],
      "code_sha256": "f70880cbf9c105d04e94e94a196cf1b52e5af4a4ba76897e7a1a30110c9b5149",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "companies",
        "officers",
        "persons"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/reinfolib_incremental.py": {
      "summary": "组织不动产交易价格接口的近期窗口刷新；大型 GIS 网格扫描与日常价格模式分开。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Scheduled reinfolib refresh entrypoint.",
      "evidence": [
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 59,
          "symbol": "_run_xit001_tasks",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 62,
          "symbol": "safe_run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 77,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 20,
          "symbol": "_add_months",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 27,
          "symbol": "_latest_publishable_xit001_quarter",
          "origin": "online"
        },
        {
          "file": "backend/scripts/reinfolib_incremental.py",
          "line": 47,
          "symbol": "_recent_quarters",
          "origin": "online"
        }
      ],
      "code_sha256": "1a30d618d506f0deb2491684f8afcfb6abb466ea050ed4954a205af279648e10",
      "sources": [
        "reinfolib"
      ],
      "business_outputs": [
        "appraisal_reports",
        "real_estate_transactions"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_court_case_intelligence_job.py": {
      "summary": "包装已有判例情报回填和校验流程，登记任务运行记录，供调度器去重与追踪。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Scheduled court case intelligence refresh job.",
      "evidence": [
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 21,
          "symbol": "run_child",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 56,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 38,
          "symbol": "tail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_court_case_intelligence_job.py",
          "line": 44,
          "symbol": "compact_validation_report",
          "origin": "online"
        }
      ],
      "code_sha256": "81636277046c2e3f4a1a546f7cbbe0259c85bcea96d63cf581c3be7427dfd5a9",
      "sources": [
        "court_case_intelligence"
      ],
      "business_outputs": [
        "risk_events"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_gbizinfo_html_batch.py": {
      "summary": "批量选择符合条件且需补官网等资料的企业，调用 gBizINFO HTML 采集器，保存原文并更新企业官网；通过已有记录支持续跑，具体候选范围依版本过滤条件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Production batch runner — gBizINFO HTML profile scraper at ~500K corp scale.",
      "evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 120,
          "symbol": "fetch_remaining",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 212,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 339,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 127,
          "symbol": "initial_count",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 133,
          "symbol": "update_job_progress",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 161,
          "symbol": "worker",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch.py",
          "line": 226,
          "symbol": "_on_sigterm",
          "origin": "online"
        }
      ],
      "code_sha256": "a4067145c633d7dee36f0c6b6eafbb920e3db31d71e99c2211c8b315feb5f4bf",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_gbizinfo_html_batch_expanded.py": {
      "summary": "批量选择符合条件且需补官网等资料的企业，调用 gBizINFO HTML 采集器，保存原文并更新企业官网；通过已有记录支持续跑，具体候选范围依版本过滤条件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Production batch runner — gBizINFO HTML profile scraper at ~500K corp scale.",
      "evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 94,
          "symbol": "fetch_remaining",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 186,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 308,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 101,
          "symbol": "initial_count",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 107,
          "symbol": "update_job_progress",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 135,
          "symbol": "worker",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_expanded.py",
          "line": 200,
          "symbol": "_on_sigterm",
          "origin": "online"
        }
      ],
      "code_sha256": "eee635ace5d5cd2b42ab8497b243f58d4aef26a91561791fdfb3afda80d91d33",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py": {
      "summary": "批量选择符合条件且需补官网等资料的企业，调用 gBizINFO HTML 采集器，保存原文并更新企业官网；通过已有记录支持续跑，具体候选范围依版本过滤条件。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Production batch runner — gBizINFO HTML profile scraper at ~500K corp scale.",
      "evidence": [
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 94,
          "symbol": "fetch_remaining",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 186,
          "symbol": "run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 308,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 101,
          "symbol": "initial_count",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 107,
          "symbol": "update_job_progress",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 135,
          "symbol": "worker",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_gbizinfo_html_batch_kind301_broaden.py",
          "line": 200,
          "symbol": "_on_sigterm",
          "origin": "online"
        }
      ],
      "code_sha256": "b8d0663694d4659c314ed10b493cb7baec4016b5aa3f0d2e9de77de5060b0ae6",
      "sources": [
        "gbizinfo_html"
      ],
      "business_outputs": [
        "companies"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_phase4_v3_subpages.py": {
      "summary": "从企业官网定位沿革、招聘、产品、IR 和新闻子页面，保存文本摘要及按类型解析的结构化内容；招聘结果主要为线索。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Phase 4 v3 — Multi-subpage corporate website scraper.",
      "evidence": [
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 241,
          "symbol": "parse_history",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 295,
          "symbol": "parse_hiring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 332,
          "symbol": "parse_products",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 376,
          "symbol": "parse_ir",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 413,
          "symbol": "parse_news",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 488,
          "symbol": "_fetch",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 532,
          "symbol": "save_subpage_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 714,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 68,
          "symbol": "next_ua",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_v3_subpages.py",
          "line": 80,
          "symbol": "throttle",
          "origin": "online"
        }
      ],
      "code_sha256": "7a3d61f19827f00b021b9d1e922643ee7d917ba5b4601f32233dd8713c6918ad",
      "sources": [
        "company_website_data"
      ],
      "business_outputs": [
        "company_subpage_data"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_phase4_website_scraper.py": {
      "summary": "逐企业读取官网首页和公司概要，按表格、标签及页面元数据提取名称、地址、代表人、电话、业务和成立等信息。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Phase 4 — Company-website data extraction.",
      "evidence": [
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 258,
          "symbol": "_extract_table_pairs",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 269,
          "symbol": "parse_homepage",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 456,
          "symbol": "_fetch",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 516,
          "symbol": "fetch_and_parse",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 647,
          "symbol": "save_record",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 696,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 65,
          "symbol": "next_ua",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 79,
          "symbol": "throttle",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 152,
          "symbol": "_detect_charset",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_phase4_website_scraper.py",
          "line": 165,
          "symbol": "_strip_tags",
          "origin": "online"
        }
      ],
      "code_sha256": "c99c6f06b42eaf54d493d8fe3b994c3b3bd660c170d788d35831ffd11c662e3d",
      "sources": [
        "company_website_data"
      ],
      "business_outputs": [
        "company_website_data"
      ],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/run_scheduler.py": {
      "summary": "读取调度配置，按 cron 启动子进程并控制超时，向调度运行表记录状态和日志尾部。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "tyc-japan production scheduler.",
      "evidence": [
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 2,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 81,
          "symbol": "_insert_run",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 186,
          "symbol": "run_job",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 432,
          "symbol": "cmd_run_once",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 466,
          "symbol": "main",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 77,
          "symbol": "_db_conn",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 95,
          "symbol": "_mark_started",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 107,
          "symbol": "_mark_finished",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 141,
          "symbol": "_effective_timeout_min",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 178,
          "symbol": "_tail",
          "origin": "online"
        },
        {
          "file": "backend/scripts/run_scheduler.py",
          "line": 275,
          "symbol": "load_schedule",
          "origin": "online"
        }
      ],
      "code_sha256": "fd0aa7a40e0ff8641c4865f689ff3138589ea811ac257dabee42775e8ea4922e",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/seed_data_sources.py": {
      "summary": "将预设来源元信息登记或更新到来源表，是公共元数据管理程序。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "把 P0 数据源元信息写入 data_sources 表.",
      "evidence": [
        {
          "file": "backend/scripts/seed_data_sources.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/seed_data_sources.py",
          "line": 572,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "b2ecdd51724d76be2b11144f16e704e65dd9e824a5b164eb247eb2a7aac5030e",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/seed_field_lineage.py": {
      "summary": "登记业务字段与来源、解析器及说明之间的声明关系，供字段溯源使用；声明不等于实际执行证据。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Populate field_lineage table — 每个字段从哪个源、用什么 parser 抓的.",
      "evidence": [
        {
          "file": "backend/scripts/seed_field_lineage.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/seed_field_lineage.py",
          "line": 379,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "a4b2e45124c3a2b2dfe7793a9d03bbf80990b368cb73b6c2aadf91fdf1955bcf",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    },
    "backend/scripts/seed_field_lineage_extras.py": {
      "summary": "补充尚缺说明的表字段溯源声明，按字段键更新来源及解析说明。",
      "origin": "online",
      "code_available": true,
      "document_excerpt": "Seed field_lineage rows for the 28 tables missing column descriptions.",
      "evidence": [
        {
          "file": "backend/scripts/seed_field_lineage_extras.py",
          "line": 1,
          "symbol": "module_docstring",
          "origin": "online"
        },
        {
          "file": "backend/scripts/seed_field_lineage_extras.py",
          "line": 492,
          "symbol": "main",
          "origin": "online"
        }
      ],
      "code_sha256": "f26ea9cbfbf9eacf2f6e003d8835b00d2a7b45373962f67974af557c086160ed",
      "sources": [],
      "business_outputs": [],
      "scope_note": "说明归纳代码的采集／处理能力，实际范围仍取决于参数、分支和输入；不证明最近运行成功。",
      "snapshot_at": "2026-11-03T08:36:08.762243+00:00"
    }
  },
  "description_metadata": {
    "checked_at": "2026-11-03T08:44:57.872146+00:00",
    "source_count": 223,
    "crawler_count": 239,
    "website_review_counts": {
      "public_page_response": 166,
      "shell_or_short_response": 14,
      "unavailable": 28,
      "error_page": 7,
      "logical_source": 6,
      "file_entry": 2
    },
    "crawler_origin_counts": {
      "online": 239
    },
    "summaries_needing_review": [],
    "note": "功能描述不增加、合并或更改 source → crawler → table 关系。"
  },
  "ubuntu_review": {
    "checked_at": "2026-11-03T08:36:08.762243+00:00",
    "ssh_user": "ubuntu",
    "deployment_root": "/tyc-japan/tyc-japan",
    "read_only": "on",
    "previously_unreadable_files_now_readable": 89,
    "upgraded_relationships": 97,
    "added_business_relationships": [
      {
        "source": "company_public_legal_pages",
        "crawler": "backend/scripts/crawl_website_responsible_person_clues.py",
        "table": "public_representative_clues"
      },
      {
        "source": "company_website_data",
        "crawler": "backend/scripts/backfill_officers_from_website.py",
        "table": "officers"
      },
      {
        "source": "company_website_data",
        "crawler": "backend/scripts/backfill_officers_from_website.py",
        "table": "persons"
      },
      {
        "source": "edinet",
        "crawler": "backend/scripts/backfill_en_name_from_edinet.py",
        "table": "companies"
      },
      {
        "source": "geps",
        "crawler": "backend/scripts/backfill_geps_representatives.py",
        "table": "officers"
      },
      {
        "source": "geps",
        "crawler": "backend/scripts/backfill_geps_representatives.py",
        "table": "persons"
      },
      {
        "source": "jetro_case_studies",
        "crawler": "backend/scripts/import_jetro_representatives.py",
        "table": "officers"
      },
      {
        "source": "jetro_case_studies",
        "crawler": "backend/scripts/import_jetro_representatives.py",
        "table": "persons"
      },
      {
        "source": "medical_info_net_pharmacy",
        "crawler": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
        "table": "officers"
      },
      {
        "source": "medical_info_net_pharmacy",
        "crawler": "backend/scripts/import_medical_info_net_pharmacy_reps.py",
        "table": "persons"
      }
    ],
    "resolved_sources": [
      "medical_info_net_pharmacy",
      "company_public_legal_pages"
    ],
    "remaining_unresolved_sources": 9,
    "scope_note": "ubuntu只读补查结果；本次仅更新独立看板静态文件和看板监听端口，不修改业务项目、数据库或其他服务。",
    "refresh_evidence": [
      {
        "table": "seo_company_name_bucket_rank",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      },
      {
        "table": "seo_company_name_index",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      },
      {
        "table": "seo_company_sitemap_prefixes",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      },
      {
        "table": "seo_invoice_sitemap_prefixes",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_company_priority_sitemap_index",
        "line": 289,
        "call_line": 879,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:05:36.718717+00:00"
      },
      {
        "table": "seo_person_name_bucket_rank",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      },
      {
        "table": "seo_person_name_index",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      },
      {
        "table": "seo_person_priority_index",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      },
      {
        "table": "seo_person_sitemap_prefixes",
        "program": "backend/scripts/seo_daily_control_loop.py",
        "function": "refresh_seo_person_priority_index",
        "line": 206,
        "call_line": 880,
        "wrapper": "backend/scripts/cron_seo_control_loop.sh:14",
        "configuration": "ubuntu crontab: 20 4 * * *",
        "timezone": "Etc/UTC",
        "schedule_label": "每天 04:20 UTC／12:20 北京时间（13:20 日本时间）；ubuntu crontab 配置",
        "condition": "未指定 --skip-priority-refresh 时尝试刷新；异常或任务失败可能导致未完成。",
        "latest_observed_success": "2026-06-15T03:06:29.477526+00:00"
      }
    ],
    "new_processing_programs": [
      "backend/scripts/backfill_political_donation_corporate_numbers.py",
      "backend/scripts/build_virtual_orgs.py",
      "backend/scripts/enqueue_legal_registry_requests.py",
      "backend/scripts/import_registry_supplier_return.py",
      "backend/scripts/enqueue_legal_registry_requests_from_batch.py",
      "backend/scripts/backfill_new_source_company_matches.py",
      "backend/scripts/fetch_legal_registry_toukikun.py"
    ],
    "resolved_processing_tables": [
      "company_registered_profiles",
      "legal_registry_requests",
      "virtual_organizations"
    ],
    "seo_refresh_runtime": {
      "checked_at": "2026-11-03T08:43:20.395904+00:00",
      "system_timezone": "Etc/UTC",
      "cron": [
        "20 4 * * * /tyc-japan/tyc-japan/backend/scripts/cron_seo_control_loop.sh >> /var/log/tyc/seo_control_loop.log 2>&1"
      ],
      "latest_reports": [
        {
          "path": "/tyc-japan/tyc-japan/reports/seo_control_loop_latest.json",
          "mtime": "2026-06-15T03:08:57.582432+00:00",
          "refresh": {
            "seo_company_priority_sitemap_index_refresh": {
              "ok": true,
              "refreshed": [
                "seo_company_priority_sitemap_index",
                "seo_company_name_index",
                "seo_company_name_bucket_rank",
                "seo_company_sitemap_prefixes",
                "seo_invoice_sitemap_prefixes"
              ],
              "missing": [],
              "started_at": "2026-06-15T03:02:44.378192+00:00",
              "finished_at": "2026-06-15T03:05:36.718717+00:00"
            },
            "seo_person_priority_index_refresh": {
              "ok": true,
              "refreshed": [
                "seo_person_priority_index",
                "seo_person_name_index",
                "seo_person_name_bucket_rank",
                "seo_person_sitemap_prefixes"
              ],
              "missing": [],
              "started_at": "2026-06-15T03:05:36.718749+00:00",
              "finished_at": "2026-06-15T03:06:29.477526+00:00"
            }
          }
        }
      ]
    }
  }
}
